* [PATCH 0/3] drm/msm/a6xx: devcore dump fixes
@ 2022-10-13 22:55 ` Rob Clark
0 siblings, 0 replies; 12+ messages in thread
From: Rob Clark @ 2022-10-13 22:55 UTC (permalink / raw)
To: dri-devel
Cc: linux-arm-msm, freedreno, Rob Clark, Akhil P Oommen,
Dan Carpenter, Dmitry Baryshkov, Douglas Anderson, Emma Anholt,
open list, Sean Paul
From: Rob Clark <robdclark@chromium.org>
First patch fixes a recently introduced memory corruption, the remaining
two are cleanups.
Rob Clark (3):
drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
drm/msm/a6xx: Skip snapshotting unused GMU buffers
drm/msm/a6xx: Remove state objects from list before freeing
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 18 ++++++++++++++++--
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 ++++++-
2 files changed, 22 insertions(+), 3 deletions(-)
--
2.37.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 0/3] drm/msm/a6xx: devcore dump fixes
@ 2022-10-13 22:55 ` Rob Clark
0 siblings, 0 replies; 12+ messages in thread
From: Rob Clark @ 2022-10-13 22:55 UTC (permalink / raw)
To: dri-devel
Cc: Rob Clark, Emma Anholt, Akhil P Oommen, linux-arm-msm,
Douglas Anderson, open list, Sean Paul, Dmitry Baryshkov,
freedreno, Dan Carpenter
From: Rob Clark <robdclark@chromium.org>
First patch fixes a recently introduced memory corruption, the remaining
two are cleanups.
Rob Clark (3):
drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
drm/msm/a6xx: Skip snapshotting unused GMU buffers
drm/msm/a6xx: Remove state objects from list before freeing
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 18 ++++++++++++++++--
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 ++++++-
2 files changed, 22 insertions(+), 3 deletions(-)
--
2.37.3
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 1/3] drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
2022-10-13 22:55 ` Rob Clark
@ 2022-10-13 22:55 ` Rob Clark
-1 siblings, 0 replies; 12+ messages in thread
From: Rob Clark @ 2022-10-13 22:55 UTC (permalink / raw)
To: dri-devel
Cc: linux-arm-msm, freedreno, Rob Clark, Rob Clark, Abhinav Kumar,
Dmitry Baryshkov, Sean Paul, David Airlie, Daniel Vetter,
Akhil P Oommen, Douglas Anderson, Emma Anholt, Dan Carpenter,
open list
From: Rob Clark <robdclark@chromium.org>
adreno_show_object() is a trap! It will re-allocate the pointer it is
passed on first call, when the data is ascii85 encoded, using kvmalloc/
kvfree(). Which means the data *passed* to it must be kvmalloc'd, ie.
we cannot use the state_kcalloc() helper.
This partially reverts
ec8f1813bf8d ("drm/msm/a6xx: Replace kcalloc() with kvzalloc()"), but
fix the missing kvfree() to fix the memory leak that was present
previously. And adds a warning comment.
Fixes: ec8f1813bf8d ("drm/msm/a6xx: Replace kcalloc() with kvzalloc()")
Closes: https://gitlab.freedesktop.org/drm/msm/-/issues/20
Signed-off-by: Rob Clark <robdclark@chromium.org>
---
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 11 ++++++++++-
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 ++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
index 3c112a6cc8a2..730355f9e2d4 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
@@ -819,7 +819,7 @@ static struct msm_gpu_state_bo *a6xx_snapshot_gmu_bo(
snapshot->iova = bo->iova;
snapshot->size = bo->size;
- snapshot->data = state_kcalloc(a6xx_state, 1, snapshot->size);
+ snapshot->data = kvzalloc(snapshot->size, GFP_KERNEL);
if (!snapshot->data)
return NULL;
@@ -1034,6 +1034,15 @@ static void a6xx_gpu_state_destroy(struct kref *kref)
struct a6xx_gpu_state *a6xx_state = container_of(state,
struct a6xx_gpu_state, base);
+ if (a6xx_state->gmu_log)
+ kvfree(a6xx_state->gmu_log->data);
+
+ if (a6xx_state->gmu_hfi)
+ kvfree(a6xx_state->gmu_hfi->data);
+
+ if (a6xx_state->gmu_debug)
+ kvfree(a6xx_state->gmu_debug->data);
+
list_for_each_entry_safe(obj, tmp, &a6xx_state->objs, node)
kvfree(obj);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 382fb7f9e497..5a0e8491cd3a 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -729,7 +729,12 @@ static char *adreno_gpu_ascii85_encode(u32 *src, size_t len)
return buf;
}
-/* len is expected to be in bytes */
+/* len is expected to be in bytes
+ *
+ * WARNING: *ptr should be allocated with kvmalloc or friends. It can be free'd
+ * with kvfree() and replaced with a newly kvmalloc'd buffer on the first call
+ * when the unencoded raw data is encoded
+ */
void adreno_show_object(struct drm_printer *p, void **ptr, int len,
bool *encoded)
{
--
2.37.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 1/3] drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
@ 2022-10-13 22:55 ` Rob Clark
0 siblings, 0 replies; 12+ messages in thread
From: Rob Clark @ 2022-10-13 22:55 UTC (permalink / raw)
To: dri-devel
Cc: Rob Clark, open list, Emma Anholt, Akhil P Oommen, David Airlie,
linux-arm-msm, Abhinav Kumar, Douglas Anderson, Sean Paul,
Dmitry Baryshkov, freedreno, Dan Carpenter
From: Rob Clark <robdclark@chromium.org>
adreno_show_object() is a trap! It will re-allocate the pointer it is
passed on first call, when the data is ascii85 encoded, using kvmalloc/
kvfree(). Which means the data *passed* to it must be kvmalloc'd, ie.
we cannot use the state_kcalloc() helper.
This partially reverts
ec8f1813bf8d ("drm/msm/a6xx: Replace kcalloc() with kvzalloc()"), but
fix the missing kvfree() to fix the memory leak that was present
previously. And adds a warning comment.
Fixes: ec8f1813bf8d ("drm/msm/a6xx: Replace kcalloc() with kvzalloc()")
Closes: https://gitlab.freedesktop.org/drm/msm/-/issues/20
Signed-off-by: Rob Clark <robdclark@chromium.org>
---
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 11 ++++++++++-
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 ++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
index 3c112a6cc8a2..730355f9e2d4 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
@@ -819,7 +819,7 @@ static struct msm_gpu_state_bo *a6xx_snapshot_gmu_bo(
snapshot->iova = bo->iova;
snapshot->size = bo->size;
- snapshot->data = state_kcalloc(a6xx_state, 1, snapshot->size);
+ snapshot->data = kvzalloc(snapshot->size, GFP_KERNEL);
if (!snapshot->data)
return NULL;
@@ -1034,6 +1034,15 @@ static void a6xx_gpu_state_destroy(struct kref *kref)
struct a6xx_gpu_state *a6xx_state = container_of(state,
struct a6xx_gpu_state, base);
+ if (a6xx_state->gmu_log)
+ kvfree(a6xx_state->gmu_log->data);
+
+ if (a6xx_state->gmu_hfi)
+ kvfree(a6xx_state->gmu_hfi->data);
+
+ if (a6xx_state->gmu_debug)
+ kvfree(a6xx_state->gmu_debug->data);
+
list_for_each_entry_safe(obj, tmp, &a6xx_state->objs, node)
kvfree(obj);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 382fb7f9e497..5a0e8491cd3a 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -729,7 +729,12 @@ static char *adreno_gpu_ascii85_encode(u32 *src, size_t len)
return buf;
}
-/* len is expected to be in bytes */
+/* len is expected to be in bytes
+ *
+ * WARNING: *ptr should be allocated with kvmalloc or friends. It can be free'd
+ * with kvfree() and replaced with a newly kvmalloc'd buffer on the first call
+ * when the unencoded raw data is encoded
+ */
void adreno_show_object(struct drm_printer *p, void **ptr, int len,
bool *encoded)
{
--
2.37.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/3] drm/msm/a6xx: Skip snapshotting unused GMU buffers
2022-10-13 22:55 ` Rob Clark
@ 2022-10-13 22:55 ` Rob Clark
-1 siblings, 0 replies; 12+ messages in thread
From: Rob Clark @ 2022-10-13 22:55 UTC (permalink / raw)
To: dri-devel
Cc: linux-arm-msm, freedreno, Rob Clark, Rob Clark, Abhinav Kumar,
Dmitry Baryshkov, Sean Paul, David Airlie, Daniel Vetter,
Akhil P Oommen, Douglas Anderson, open list
From: Rob Clark <robdclark@chromium.org>
Some buffers are unused on certain sub-generations of a6xx. So just
skip them.
Signed-off-by: Rob Clark <robdclark@chromium.org>
---
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
index 730355f9e2d4..b0124d0f286c 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
@@ -813,6 +813,9 @@ static struct msm_gpu_state_bo *a6xx_snapshot_gmu_bo(
{
struct msm_gpu_state_bo *snapshot;
+ if (!bo->size)
+ return NULL;
+
snapshot = state_kcalloc(a6xx_state, 1, sizeof(*snapshot));
if (!snapshot)
return NULL;
--
2.37.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 2/3] drm/msm/a6xx: Skip snapshotting unused GMU buffers
@ 2022-10-13 22:55 ` Rob Clark
0 siblings, 0 replies; 12+ messages in thread
From: Rob Clark @ 2022-10-13 22:55 UTC (permalink / raw)
To: dri-devel
Cc: Rob Clark, Akhil P Oommen, David Airlie, linux-arm-msm,
Abhinav Kumar, Douglas Anderson, Sean Paul, Dmitry Baryshkov,
freedreno, open list
From: Rob Clark <robdclark@chromium.org>
Some buffers are unused on certain sub-generations of a6xx. So just
skip them.
Signed-off-by: Rob Clark <robdclark@chromium.org>
---
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
index 730355f9e2d4..b0124d0f286c 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
@@ -813,6 +813,9 @@ static struct msm_gpu_state_bo *a6xx_snapshot_gmu_bo(
{
struct msm_gpu_state_bo *snapshot;
+ if (!bo->size)
+ return NULL;
+
snapshot = state_kcalloc(a6xx_state, 1, sizeof(*snapshot));
if (!snapshot)
return NULL;
--
2.37.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/3] drm/msm/a6xx: Remove state objects from list before freeing
2022-10-13 22:55 ` Rob Clark
@ 2022-10-13 22:55 ` Rob Clark
-1 siblings, 0 replies; 12+ messages in thread
From: Rob Clark @ 2022-10-13 22:55 UTC (permalink / raw)
To: dri-devel
Cc: linux-arm-msm, freedreno, Rob Clark, Rob Clark, Abhinav Kumar,
Dmitry Baryshkov, Sean Paul, David Airlie, Daniel Vetter,
Akhil P Oommen, Douglas Anderson, open list
From: Rob Clark <robdclark@chromium.org>
Technically it worked as it was before, only because it was using the
_safe version of the iterator. But it is sloppy practice to leave
dangling pointers.
Signed-off-by: Rob Clark <robdclark@chromium.org>
---
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
index b0124d0f286c..a5c3d1ed255a 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
@@ -1046,8 +1046,10 @@ static void a6xx_gpu_state_destroy(struct kref *kref)
if (a6xx_state->gmu_debug)
kvfree(a6xx_state->gmu_debug->data);
- list_for_each_entry_safe(obj, tmp, &a6xx_state->objs, node)
+ list_for_each_entry_safe(obj, tmp, &a6xx_state->objs, node) {
+ list_del(&obj->node);
kvfree(obj);
+ }
adreno_gpu_state_destroy(state);
kfree(a6xx_state);
--
2.37.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH 3/3] drm/msm/a6xx: Remove state objects from list before freeing
@ 2022-10-13 22:55 ` Rob Clark
0 siblings, 0 replies; 12+ messages in thread
From: Rob Clark @ 2022-10-13 22:55 UTC (permalink / raw)
To: dri-devel
Cc: Rob Clark, Akhil P Oommen, David Airlie, linux-arm-msm,
Abhinav Kumar, Douglas Anderson, Sean Paul, Dmitry Baryshkov,
freedreno, open list
From: Rob Clark <robdclark@chromium.org>
Technically it worked as it was before, only because it was using the
_safe version of the iterator. But it is sloppy practice to leave
dangling pointers.
Signed-off-by: Rob Clark <robdclark@chromium.org>
---
drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
index b0124d0f286c..a5c3d1ed255a 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c
@@ -1046,8 +1046,10 @@ static void a6xx_gpu_state_destroy(struct kref *kref)
if (a6xx_state->gmu_debug)
kvfree(a6xx_state->gmu_debug->data);
- list_for_each_entry_safe(obj, tmp, &a6xx_state->objs, node)
+ list_for_each_entry_safe(obj, tmp, &a6xx_state->objs, node) {
+ list_del(&obj->node);
kvfree(obj);
+ }
adreno_gpu_state_destroy(state);
kfree(a6xx_state);
--
2.37.3
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Freedreno] [PATCH 0/3] drm/msm/a6xx: devcore dump fixes
2022-10-13 22:55 ` Rob Clark
@ 2022-10-14 0:19 ` Chia-I Wu
-1 siblings, 0 replies; 12+ messages in thread
From: Chia-I Wu @ 2022-10-14 0:19 UTC (permalink / raw)
To: Rob Clark
Cc: dri-devel, Rob Clark, Emma Anholt, Akhil P Oommen, linux-arm-msm,
Douglas Anderson, open list, Sean Paul, Dmitry Baryshkov,
freedreno, Dan Carpenter
On Thu, Oct 13, 2022 at 3:55 PM Rob Clark <robdclark@gmail.com> wrote:
>
> From: Rob Clark <robdclark@chromium.org>
>
> First patch fixes a recently introduced memory corruption, the remaining
> two are cleanups.
Series is
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
> Rob Clark (3):
> drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
> drm/msm/a6xx: Skip snapshotting unused GMU buffers
> drm/msm/a6xx: Remove state objects from list before freeing
>
> drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 18 ++++++++++++++++--
> drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 ++++++-
> 2 files changed, 22 insertions(+), 3 deletions(-)
>
> --
> 2.37.3
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Freedreno] [PATCH 0/3] drm/msm/a6xx: devcore dump fixes
@ 2022-10-14 0:19 ` Chia-I Wu
0 siblings, 0 replies; 12+ messages in thread
From: Chia-I Wu @ 2022-10-14 0:19 UTC (permalink / raw)
To: Rob Clark
Cc: Rob Clark, freedreno, Emma Anholt, Akhil P Oommen, linux-arm-msm,
Douglas Anderson, dri-devel, open list, Dmitry Baryshkov,
Sean Paul, Dan Carpenter
On Thu, Oct 13, 2022 at 3:55 PM Rob Clark <robdclark@gmail.com> wrote:
>
> From: Rob Clark <robdclark@chromium.org>
>
> First patch fixes a recently introduced memory corruption, the remaining
> two are cleanups.
Series is
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
> Rob Clark (3):
> drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
> drm/msm/a6xx: Skip snapshotting unused GMU buffers
> drm/msm/a6xx: Remove state objects from list before freeing
>
> drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 18 ++++++++++++++++--
> drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 ++++++-
> 2 files changed, 22 insertions(+), 3 deletions(-)
>
> --
> 2.37.3
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0/3] drm/msm/a6xx: devcore dump fixes
2022-10-13 22:55 ` Rob Clark
@ 2022-10-14 6:50 ` Akhil P Oommen
-1 siblings, 0 replies; 12+ messages in thread
From: Akhil P Oommen @ 2022-10-14 6:50 UTC (permalink / raw)
To: Rob Clark, dri-devel
Cc: linux-arm-msm, freedreno, Rob Clark, Dan Carpenter,
Dmitry Baryshkov, Douglas Anderson, Emma Anholt, open list,
Sean Paul
On 10/14/2022 4:25 AM, Rob Clark wrote:
> From: Rob Clark <robdclark@chromium.org>
>
> First patch fixes a recently introduced memory corruption, the remaining
> two are cleanups.
>
> Rob Clark (3):
> drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
> drm/msm/a6xx: Skip snapshotting unused GMU buffers
> drm/msm/a6xx: Remove state objects from list before freeing
>
> drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 18 ++++++++++++++++--
> drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 ++++++-
> 2 files changed, 22 insertions(+), 3 deletions(-)
For the entire series:
Reviewed-by: Akhil P Oommen <quic_akhilpo@quicinc.com>
-Akhil
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 0/3] drm/msm/a6xx: devcore dump fixes
@ 2022-10-14 6:50 ` Akhil P Oommen
0 siblings, 0 replies; 12+ messages in thread
From: Akhil P Oommen @ 2022-10-14 6:50 UTC (permalink / raw)
To: Rob Clark, dri-devel
Cc: Rob Clark, Emma Anholt, linux-arm-msm, Douglas Anderson,
open list, Sean Paul, Dmitry Baryshkov, freedreno, Dan Carpenter
On 10/14/2022 4:25 AM, Rob Clark wrote:
> From: Rob Clark <robdclark@chromium.org>
>
> First patch fixes a recently introduced memory corruption, the remaining
> two are cleanups.
>
> Rob Clark (3):
> drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage
> drm/msm/a6xx: Skip snapshotting unused GMU buffers
> drm/msm/a6xx: Remove state objects from list before freeing
>
> drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | 18 ++++++++++++++++--
> drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 ++++++-
> 2 files changed, 22 insertions(+), 3 deletions(-)
For the entire series:
Reviewed-by: Akhil P Oommen <quic_akhilpo@quicinc.com>
-Akhil
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2022-10-14 6:50 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-13 22:55 [PATCH 0/3] drm/msm/a6xx: devcore dump fixes Rob Clark
2022-10-13 22:55 ` Rob Clark
2022-10-13 22:55 ` [PATCH 1/3] drm/msm/a6xx: Fix kvzalloc vs state_kcalloc usage Rob Clark
2022-10-13 22:55 ` Rob Clark
2022-10-13 22:55 ` [PATCH 2/3] drm/msm/a6xx: Skip snapshotting unused GMU buffers Rob Clark
2022-10-13 22:55 ` Rob Clark
2022-10-13 22:55 ` [PATCH 3/3] drm/msm/a6xx: Remove state objects from list before freeing Rob Clark
2022-10-13 22:55 ` Rob Clark
2022-10-14 0:19 ` [Freedreno] [PATCH 0/3] drm/msm/a6xx: devcore dump fixes Chia-I Wu
2022-10-14 0:19 ` Chia-I Wu
2022-10-14 6:50 ` Akhil P Oommen
2022-10-14 6:50 ` Akhil P Oommen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.