* [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup
@ 2024-02-05 18:27 Andrew Davis
2024-02-05 18:27 ` [PATCH v2 1/5] remoteproc: k3-dsp: Use devm_ti_sci_get_by_phandle() helper Andrew Davis
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Andrew Davis @ 2024-02-05 18:27 UTC (permalink / raw)
To: Jai Luthra, Hari Nagalla, Bjorn Andersson, Mathieu Poirier
Cc: linux-remoteproc, linux-kernel, Andrew Davis
Hello all,
This series uses various devm_ helpers to simplify the device
removal path.
Removing an unused var "ret1" got squashed into the wrong patch in
the v1 series causing a bisectability error. v2 is based on -next
with the first 3 already taken. These are the last 5 patches of the
v1 series[0].
Thanks,
Andrew
[0] https://lore.kernel.org/lkml/20240123184913.725435-4-afd@ti.com/T/
Andrew Davis (5):
remoteproc: k3-dsp: Use devm_ti_sci_get_by_phandle() helper
remoteproc: k3-dsp: Use devm_kzalloc() helper
remoteproc: k3-dsp: Add devm action to release tsp
remoteproc: k3-dsp: Use devm_ioremap_wc() helper
remoteproc: k3-dsp: Use devm_rproc_add() helper
drivers/remoteproc/ti_k3_dsp_remoteproc.c | 116 ++++++----------------
1 file changed, 32 insertions(+), 84 deletions(-)
--
2.39.2
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 1/5] remoteproc: k3-dsp: Use devm_ti_sci_get_by_phandle() helper
2024-02-05 18:27 [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Andrew Davis
@ 2024-02-05 18:27 ` Andrew Davis
2024-02-05 18:27 ` [PATCH v2 2/5] remoteproc: k3-dsp: Use devm_kzalloc() helper Andrew Davis
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Andrew Davis @ 2024-02-05 18:27 UTC (permalink / raw)
To: Jai Luthra, Hari Nagalla, Bjorn Andersson, Mathieu Poirier
Cc: linux-remoteproc, linux-kernel, Andrew Davis
Use the device lifecycle managed TI-SCI get() function. This helps prevent
mistakes like not put()'ing in the wrong order in cleanup functions and
forgetting to put() on error paths.
Signed-off-by: Andrew Davis <afd@ti.com>
---
drivers/remoteproc/ti_k3_dsp_remoteproc.c | 32 +++++++----------------
1 file changed, 9 insertions(+), 23 deletions(-)
diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
index a13552c71f440..64ec5759c4ec1 100644
--- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
@@ -708,30 +708,24 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
kproc->dev = dev;
kproc->data = data;
- kproc->ti_sci = ti_sci_get_by_phandle(np, "ti,sci");
+ kproc->ti_sci = devm_ti_sci_get_by_phandle(dev, "ti,sci");
if (IS_ERR(kproc->ti_sci))
return dev_err_probe(dev, PTR_ERR(kproc->ti_sci),
"failed to get ti-sci handle\n");
ret = of_property_read_u32(np, "ti,sci-dev-id", &kproc->ti_sci_id);
- if (ret) {
- dev_err_probe(dev, ret, "missing 'ti,sci-dev-id' property\n");
- goto put_sci;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "missing 'ti,sci-dev-id' property\n");
kproc->reset = devm_reset_control_get_exclusive(dev, NULL);
- if (IS_ERR(kproc->reset)) {
- ret = dev_err_probe(dev, PTR_ERR(kproc->reset),
- "failed to get reset\n");
- goto put_sci;
- }
+ if (IS_ERR(kproc->reset))
+ return dev_err_probe(dev, PTR_ERR(kproc->reset),
+ "failed to get reset\n");
kproc->tsp = k3_dsp_rproc_of_get_tsp(dev, kproc->ti_sci);
- if (IS_ERR(kproc->tsp)) {
- ret = dev_err_probe(dev, PTR_ERR(kproc->tsp),
- "failed to construct ti-sci proc control\n");
- goto put_sci;
- }
+ if (IS_ERR(kproc->tsp))
+ return dev_err_probe(dev, PTR_ERR(kproc->tsp),
+ "failed to construct ti-sci proc control\n");
ret = ti_sci_proc_request(kproc->tsp);
if (ret < 0) {
@@ -805,10 +799,6 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
dev_err(dev, "failed to release proc (%pe)\n", ERR_PTR(ret1));
free_tsp:
kfree(kproc->tsp);
-put_sci:
- ret1 = ti_sci_put_handle(kproc->ti_sci);
- if (ret1)
- dev_err(dev, "failed to put ti_sci handle (%pe)\n", ERR_PTR(ret1));
return ret;
}
@@ -836,10 +826,6 @@ static void k3_dsp_rproc_remove(struct platform_device *pdev)
kfree(kproc->tsp);
- ret = ti_sci_put_handle(kproc->ti_sci);
- if (ret)
- dev_err(dev, "failed to put ti_sci handle (%pe)\n", ERR_PTR(ret));
-
k3_dsp_reserved_mem_exit(kproc);
}
--
2.39.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 2/5] remoteproc: k3-dsp: Use devm_kzalloc() helper
2024-02-05 18:27 [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Andrew Davis
2024-02-05 18:27 ` [PATCH v2 1/5] remoteproc: k3-dsp: Use devm_ti_sci_get_by_phandle() helper Andrew Davis
@ 2024-02-05 18:27 ` Andrew Davis
2024-02-05 18:27 ` [PATCH v2 3/5] remoteproc: k3-dsp: Add devm action to release tsp Andrew Davis
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Andrew Davis @ 2024-02-05 18:27 UTC (permalink / raw)
To: Jai Luthra, Hari Nagalla, Bjorn Andersson, Mathieu Poirier
Cc: linux-remoteproc, linux-kernel, Andrew Davis
Use device lifecycle managed devm_kzalloc() helper function. This helps
prevent mistakes like freeing out of order in cleanup functions and
forgetting to free on all error paths.
Signed-off-by: Andrew Davis <afd@ti.com>
---
drivers/remoteproc/ti_k3_dsp_remoteproc.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
index 64ec5759c4ec1..b9332c66a52ab 100644
--- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
@@ -659,7 +659,7 @@ struct ti_sci_proc *k3_dsp_rproc_of_get_tsp(struct device *dev,
if (ret < 0)
return ERR_PTR(ret);
- tsp = kzalloc(sizeof(*tsp), GFP_KERNEL);
+ tsp = devm_kzalloc(dev, sizeof(*tsp), GFP_KERNEL);
if (!tsp)
return ERR_PTR(-ENOMEM);
@@ -730,7 +730,7 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
ret = ti_sci_proc_request(kproc->tsp);
if (ret < 0) {
dev_err_probe(dev, ret, "ti_sci_proc_request failed\n");
- goto free_tsp;
+ return ret;
}
ret = k3_dsp_rproc_of_get_memories(pdev, kproc);
@@ -797,8 +797,6 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
ret1 = ti_sci_proc_release(kproc->tsp);
if (ret1)
dev_err(dev, "failed to release proc (%pe)\n", ERR_PTR(ret1));
-free_tsp:
- kfree(kproc->tsp);
return ret;
}
@@ -824,8 +822,6 @@ static void k3_dsp_rproc_remove(struct platform_device *pdev)
if (ret)
dev_err(dev, "failed to release proc (%pe)\n", ERR_PTR(ret));
- kfree(kproc->tsp);
-
k3_dsp_reserved_mem_exit(kproc);
}
--
2.39.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 3/5] remoteproc: k3-dsp: Add devm action to release tsp
2024-02-05 18:27 [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Andrew Davis
2024-02-05 18:27 ` [PATCH v2 1/5] remoteproc: k3-dsp: Use devm_ti_sci_get_by_phandle() helper Andrew Davis
2024-02-05 18:27 ` [PATCH v2 2/5] remoteproc: k3-dsp: Use devm_kzalloc() helper Andrew Davis
@ 2024-02-05 18:27 ` Andrew Davis
2024-02-05 18:27 ` [PATCH v2 4/5] remoteproc: k3-dsp: Use devm_ioremap_wc() helper Andrew Davis
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Andrew Davis @ 2024-02-05 18:27 UTC (permalink / raw)
To: Jai Luthra, Hari Nagalla, Bjorn Andersson, Mathieu Poirier
Cc: linux-remoteproc, linux-kernel, Andrew Davis
Use a device lifecycle managed action to release tps ti_sci_proc handle.
This helps prevent mistakes like releasing out of order in cleanup
functions and forgetting to release on error paths.
Signed-off-by: Andrew Davis <afd@ti.com>
---
drivers/remoteproc/ti_k3_dsp_remoteproc.c | 27 +++++++++++------------
1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
index b9332c66a52ab..800c8c6767086 100644
--- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
@@ -646,6 +646,13 @@ static void k3_dsp_reserved_mem_exit(struct k3_dsp_rproc *kproc)
iounmap(kproc->rmem[i].cpu_addr);
}
+static void k3_dsp_release_tsp(void *data)
+{
+ struct ti_sci_proc *tsp = data;
+
+ ti_sci_proc_release(tsp);
+}
+
static
struct ti_sci_proc *k3_dsp_rproc_of_get_tsp(struct device *dev,
const struct ti_sci_handle *sci)
@@ -682,7 +689,6 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
const char *fw_name;
bool p_state = false;
int ret = 0;
- int ret1;
data = of_device_get_match_data(dev);
if (!data)
@@ -732,16 +738,17 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
dev_err_probe(dev, ret, "ti_sci_proc_request failed\n");
return ret;
}
+ ret = devm_add_action_or_reset(dev, k3_dsp_release_tsp, kproc->tsp);
+ if (ret)
+ return ret;
ret = k3_dsp_rproc_of_get_memories(pdev, kproc);
if (ret)
- goto release_tsp;
+ return ret;
ret = k3_dsp_reserved_mem_init(kproc);
- if (ret) {
- dev_err_probe(dev, ret, "reserved memory init failed\n");
- goto release_tsp;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "reserved memory init failed\n");
ret = kproc->ti_sci->ops.dev_ops.is_on(kproc->ti_sci, kproc->ti_sci_id,
NULL, &p_state);
@@ -793,10 +800,6 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
release_mem:
k3_dsp_reserved_mem_exit(kproc);
-release_tsp:
- ret1 = ti_sci_proc_release(kproc->tsp);
- if (ret1)
- dev_err(dev, "failed to release proc (%pe)\n", ERR_PTR(ret1));
return ret;
}
@@ -818,10 +821,6 @@ static void k3_dsp_rproc_remove(struct platform_device *pdev)
rproc_del(kproc->rproc);
- ret = ti_sci_proc_release(kproc->tsp);
- if (ret)
- dev_err(dev, "failed to release proc (%pe)\n", ERR_PTR(ret));
-
k3_dsp_reserved_mem_exit(kproc);
}
--
2.39.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 4/5] remoteproc: k3-dsp: Use devm_ioremap_wc() helper
2024-02-05 18:27 [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Andrew Davis
` (2 preceding siblings ...)
2024-02-05 18:27 ` [PATCH v2 3/5] remoteproc: k3-dsp: Add devm action to release tsp Andrew Davis
@ 2024-02-05 18:27 ` Andrew Davis
2024-02-05 18:27 ` [PATCH v2 5/5] remoteproc: k3-dsp: Use devm_rproc_add() helper Andrew Davis
2024-02-05 20:45 ` [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Mathieu Poirier
5 siblings, 0 replies; 7+ messages in thread
From: Andrew Davis @ 2024-02-05 18:27 UTC (permalink / raw)
To: Jai Luthra, Hari Nagalla, Bjorn Andersson, Mathieu Poirier
Cc: linux-remoteproc, linux-kernel, Andrew Davis
Use a device lifecycle managed ioremap helper function. This helps prevent
mistakes like unmapping out of order in cleanup functions and forgetting
to unmap on all error paths.
Signed-off-by: Andrew Davis <afd@ti.com>
---
drivers/remoteproc/ti_k3_dsp_remoteproc.c | 48 +++++------------------
1 file changed, 10 insertions(+), 38 deletions(-)
diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
index 800c8c6767086..f799f74734b4a 100644
--- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
@@ -598,16 +598,13 @@ static int k3_dsp_reserved_mem_init(struct k3_dsp_rproc *kproc)
/* use remaining reserved memory regions for static carveouts */
for (i = 0; i < num_rmems; i++) {
rmem_np = of_parse_phandle(np, "memory-region", i + 1);
- if (!rmem_np) {
- ret = -EINVAL;
- goto unmap_rmem;
- }
+ if (!rmem_np)
+ return -EINVAL;
rmem = of_reserved_mem_lookup(rmem_np);
if (!rmem) {
of_node_put(rmem_np);
- ret = -EINVAL;
- goto unmap_rmem;
+ return -EINVAL;
}
of_node_put(rmem_np);
@@ -615,12 +612,11 @@ static int k3_dsp_reserved_mem_init(struct k3_dsp_rproc *kproc)
/* 64-bit address regions currently not supported */
kproc->rmem[i].dev_addr = (u32)rmem->base;
kproc->rmem[i].size = rmem->size;
- kproc->rmem[i].cpu_addr = ioremap_wc(rmem->base, rmem->size);
+ kproc->rmem[i].cpu_addr = devm_ioremap_wc(dev, rmem->base, rmem->size);
if (!kproc->rmem[i].cpu_addr) {
dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n",
i + 1, &rmem->base, &rmem->size);
- ret = -ENOMEM;
- goto unmap_rmem;
+ return -ENOMEM;
}
dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %pK da 0x%x\n",
@@ -631,19 +627,6 @@ static int k3_dsp_reserved_mem_init(struct k3_dsp_rproc *kproc)
kproc->num_rmems = num_rmems;
return 0;
-
-unmap_rmem:
- for (i--; i >= 0; i--)
- iounmap(kproc->rmem[i].cpu_addr);
- return ret;
-}
-
-static void k3_dsp_reserved_mem_exit(struct k3_dsp_rproc *kproc)
-{
- int i;
-
- for (i = 0; i < kproc->num_rmems; i++)
- iounmap(kproc->rmem[i].cpu_addr);
}
static void k3_dsp_release_tsp(void *data)
@@ -752,10 +735,8 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
ret = kproc->ti_sci->ops.dev_ops.is_on(kproc->ti_sci, kproc->ti_sci_id,
NULL, &p_state);
- if (ret) {
- dev_err_probe(dev, ret, "failed to get initial state, mode cannot be determined\n");
- goto release_mem;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "failed to get initial state, mode cannot be determined\n");
/* configure J721E devices for either remoteproc or IPC-only mode */
if (p_state) {
@@ -779,8 +760,7 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
if (data->uses_lreset) {
ret = reset_control_status(kproc->reset);
if (ret < 0) {
- dev_err_probe(dev, ret, "failed to get reset status\n");
- goto release_mem;
+ return dev_err_probe(dev, ret, "failed to get reset status\n");
} else if (ret == 0) {
dev_warn(dev, "local reset is deasserted for device\n");
k3_dsp_rproc_reset(kproc);
@@ -789,18 +769,12 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
}
ret = rproc_add(rproc);
- if (ret) {
- dev_err_probe(dev, ret, "failed to add register device with remoteproc core\n");
- goto release_mem;
- }
+ if (ret)
+ return dev_err_probe(dev, ret, "failed to add register device with remoteproc core\n");
platform_set_drvdata(pdev, kproc);
return 0;
-
-release_mem:
- k3_dsp_reserved_mem_exit(kproc);
- return ret;
}
static void k3_dsp_rproc_remove(struct platform_device *pdev)
@@ -820,8 +794,6 @@ static void k3_dsp_rproc_remove(struct platform_device *pdev)
}
rproc_del(kproc->rproc);
-
- k3_dsp_reserved_mem_exit(kproc);
}
static const struct k3_dsp_mem_data c66_mems[] = {
--
2.39.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v2 5/5] remoteproc: k3-dsp: Use devm_rproc_add() helper
2024-02-05 18:27 [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Andrew Davis
` (3 preceding siblings ...)
2024-02-05 18:27 ` [PATCH v2 4/5] remoteproc: k3-dsp: Use devm_ioremap_wc() helper Andrew Davis
@ 2024-02-05 18:27 ` Andrew Davis
2024-02-05 20:45 ` [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Mathieu Poirier
5 siblings, 0 replies; 7+ messages in thread
From: Andrew Davis @ 2024-02-05 18:27 UTC (permalink / raw)
To: Jai Luthra, Hari Nagalla, Bjorn Andersson, Mathieu Poirier
Cc: linux-remoteproc, linux-kernel, Andrew Davis
Use device lifecycle managed devm_rproc_add() helper function. This helps
prevent mistakes like deleting out of order in cleanup functions and
forgetting to delete on all error paths.
Signed-off-by: Andrew Davis <afd@ti.com>
---
drivers/remoteproc/ti_k3_dsp_remoteproc.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
index f799f74734b4a..3555b535b1683 100644
--- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
@@ -768,7 +768,7 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
}
}
- ret = rproc_add(rproc);
+ ret = devm_rproc_add(dev, rproc);
if (ret)
return dev_err_probe(dev, ret, "failed to add register device with remoteproc core\n");
@@ -786,14 +786,9 @@ static void k3_dsp_rproc_remove(struct platform_device *pdev)
if (rproc->state == RPROC_ATTACHED) {
ret = rproc_detach(rproc);
- if (ret) {
- /* Note this error path leaks resources */
+ if (ret)
dev_err(dev, "failed to detach proc (%pe)\n", ERR_PTR(ret));
- return;
- }
}
-
- rproc_del(kproc->rproc);
}
static const struct k3_dsp_mem_data c66_mems[] = {
--
2.39.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup
2024-02-05 18:27 [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Andrew Davis
` (4 preceding siblings ...)
2024-02-05 18:27 ` [PATCH v2 5/5] remoteproc: k3-dsp: Use devm_rproc_add() helper Andrew Davis
@ 2024-02-05 20:45 ` Mathieu Poirier
5 siblings, 0 replies; 7+ messages in thread
From: Mathieu Poirier @ 2024-02-05 20:45 UTC (permalink / raw)
To: Andrew Davis
Cc: Jai Luthra, Hari Nagalla, Bjorn Andersson, linux-remoteproc,
linux-kernel
On Mon, Feb 05, 2024 at 12:27:48PM -0600, Andrew Davis wrote:
> Hello all,
>
> This series uses various devm_ helpers to simplify the device
> removal path.
>
> Removing an unused var "ret1" got squashed into the wrong patch in
> the v1 series causing a bisectability error. v2 is based on -next
> with the first 3 already taken. These are the last 5 patches of the
> v1 series[0].
>
> Thanks,
> Andrew
>
> [0] https://lore.kernel.org/lkml/20240123184913.725435-4-afd@ti.com/T/
>
> Andrew Davis (5):
> remoteproc: k3-dsp: Use devm_ti_sci_get_by_phandle() helper
> remoteproc: k3-dsp: Use devm_kzalloc() helper
> remoteproc: k3-dsp: Add devm action to release tsp
> remoteproc: k3-dsp: Use devm_ioremap_wc() helper
> remoteproc: k3-dsp: Use devm_rproc_add() helper
>
> drivers/remoteproc/ti_k3_dsp_remoteproc.c | 116 ++++++----------------
> 1 file changed, 32 insertions(+), 84 deletions(-)
>
I have applied this set.
Thanks,
Mathieu
> --
> 2.39.2
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-02-05 20:45 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-05 18:27 [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Andrew Davis
2024-02-05 18:27 ` [PATCH v2 1/5] remoteproc: k3-dsp: Use devm_ti_sci_get_by_phandle() helper Andrew Davis
2024-02-05 18:27 ` [PATCH v2 2/5] remoteproc: k3-dsp: Use devm_kzalloc() helper Andrew Davis
2024-02-05 18:27 ` [PATCH v2 3/5] remoteproc: k3-dsp: Add devm action to release tsp Andrew Davis
2024-02-05 18:27 ` [PATCH v2 4/5] remoteproc: k3-dsp: Use devm_ioremap_wc() helper Andrew Davis
2024-02-05 18:27 ` [PATCH v2 5/5] remoteproc: k3-dsp: Use devm_rproc_add() helper Andrew Davis
2024-02-05 20:45 ` [PATCH v2 0/5] K3 DSP Remoteproc remove cleanup Mathieu Poirier
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox