All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Koenig, Christian" <Christian.Koenig@amd.com>
To: "Ho, Kenny" <Kenny.Ho@amd.com>,
	"y2kenny@gmail.com" <y2kenny@gmail.com>,
	"cgroups@vger.kernel.org" <cgroups@vger.kernel.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>,
	"amd-gfx@lists.freedesktop.org" <amd-gfx@lists.freedesktop.org>,
	"tj@kernel.org" <tj@kernel.org>,
	"Deucher, Alexander" <Alexander.Deucher@amd.com>,
	"Kuehling, Felix" <Felix.Kuehling@amd.com>,
	"Greathouse, Joseph" <Joseph.Greathouse@amd.com>,
	"jsparks@cray.com" <jsparks@cray.com>,
	"lkaplan@cray.com" <lkaplan@cray.com>,
	"daniel@ffwll.ch" <daniel@ffwll.ch>
Subject: Re: [PATCH RFC v4 13/16] drm, cgroup: Allow more aggressive memory reclaim
Date: Thu, 29 Aug 2019 07:08:18 +0000	[thread overview]
Message-ID: <464ad318-48dd-3f78-d82b-83a8e7175ff9@amd.com> (raw)
In-Reply-To: <20190829060533.32315-14-Kenny.Ho@amd.com>

Am 29.08.19 um 08:05 schrieb Kenny Ho:
> Allow DRM TTM memory manager to register a work_struct, such that, when
> a drmcgrp is under memory pressure, memory reclaiming can be triggered
> immediately.
>
> Change-Id: I25ac04e2db9c19ff12652b88ebff18b44b2706d8
> Signed-off-by: Kenny Ho <Kenny.Ho@amd.com>
> ---
>   drivers/gpu/drm/ttm/ttm_bo.c    | 49 +++++++++++++++++++++++++++++++++
>   include/drm/drm_cgroup.h        | 16 +++++++++++
>   include/drm/ttm/ttm_bo_driver.h |  2 ++
>   kernel/cgroup/drm.c             | 30 ++++++++++++++++++++
>   4 files changed, 97 insertions(+)
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index d7e3d3128ebb..72efae694b7e 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -1590,6 +1590,46 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type)
>   }
>   EXPORT_SYMBOL(ttm_bo_evict_mm);
>   
> +static void ttm_bo_reclaim_wq(struct work_struct *work)
> +{
> +	struct ttm_operation_ctx ctx = {
> +		.interruptible = false,
> +		.no_wait_gpu = false,
> +		.flags = TTM_OPT_FLAG_FORCE_ALLOC
> +	};
> +	struct ttm_mem_type_manager *man =
> +	    container_of(work, struct ttm_mem_type_manager, reclaim_wq);
> +	struct ttm_bo_device *bdev = man->bdev;
> +	struct dma_fence *fence;
> +	int mem_type;
> +	int ret;
> +
> +	for (mem_type = 0; mem_type < TTM_NUM_MEM_TYPES; mem_type++)
> +		if (&bdev->man[mem_type] == man)
> +			break;
> +
> +	WARN_ON(mem_type >= TTM_NUM_MEM_TYPES);
> +	if (mem_type >= TTM_NUM_MEM_TYPES)
> +		return;
> +
> +	if (!drmcg_mem_pressure_scan(bdev, mem_type))
> +		return;
> +
> +	ret = ttm_mem_evict_first(bdev, mem_type, NULL, &ctx, NULL);
> +	if (ret)
> +		return;
> +
> +	spin_lock(&man->move_lock);
> +	fence = dma_fence_get(man->move);
> +	spin_unlock(&man->move_lock);
> +
> +	if (fence) {
> +		ret = dma_fence_wait(fence, false);
> +		dma_fence_put(fence);
> +	}

Why do you want to block for the fence here? That is a rather bad idea 
and would break pipe-lining.

Apart from that I don't think we should put that into TTM.

Instead drmcg_register_device_mm() should get a function pointer which 
is called from a work item when the group is under pressure.

TTM can then provides the function which can be called, but the actually 
registration is job of the device and not TTM.

Regards,
Christian.

> +
> +}
> +
>   int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type,
>   			unsigned long p_size)
>   {
> @@ -1624,6 +1664,13 @@ int ttm_bo_init_mm(struct ttm_bo_device *bdev, unsigned type,
>   		INIT_LIST_HEAD(&man->lru[i]);
>   	man->move = NULL;
>   
> +	pr_err("drmcg %p type %d\n", bdev->ddev, type);
> +
> +	if (type <= TTM_PL_VRAM) {
> +		INIT_WORK(&man->reclaim_wq, ttm_bo_reclaim_wq);
> +		drmcg_register_device_mm(bdev->ddev, type, &man->reclaim_wq);
> +	}
> +
>   	return 0;
>   }
>   EXPORT_SYMBOL(ttm_bo_init_mm);
> @@ -1701,6 +1748,8 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
>   		man = &bdev->man[i];
>   		if (man->has_type) {
>   			man->use_type = false;
> +			drmcg_unregister_device_mm(bdev->ddev, i);
> +			cancel_work_sync(&man->reclaim_wq);
>   			if ((i != TTM_PL_SYSTEM) && ttm_bo_clean_mm(bdev, i)) {
>   				ret = -EBUSY;
>   				pr_err("DRM memory manager type %d is not clean\n",
> diff --git a/include/drm/drm_cgroup.h b/include/drm/drm_cgroup.h
> index c11df388fdf2..6d9707e1eb72 100644
> --- a/include/drm/drm_cgroup.h
> +++ b/include/drm/drm_cgroup.h
> @@ -5,6 +5,7 @@
>   #define __DRM_CGROUP_H__
>   
>   #include <linux/cgroup_drm.h>
> +#include <linux/workqueue.h>
>   #include <drm/ttm/ttm_bo_api.h>
>   #include <drm/ttm/ttm_bo_driver.h>
>   
> @@ -25,12 +26,17 @@ struct drmcg_props {
>   	s64			mem_bw_avg_bytes_per_us_default;
>   
>   	s64			mem_highs_default[TTM_PL_PRIV+1];
> +
> +	struct work_struct	*mem_reclaim_wq[TTM_PL_PRIV];
>   };
>   
>   #ifdef CONFIG_CGROUP_DRM
>   
>   void drmcg_device_update(struct drm_device *device);
>   void drmcg_device_early_init(struct drm_device *device);
> +void drmcg_register_device_mm(struct drm_device *dev, unsigned int type,
> +		struct work_struct *wq);
> +void drmcg_unregister_device_mm(struct drm_device *dev, unsigned int type);
>   bool drmcg_try_chg_bo_alloc(struct drmcg *drmcg, struct drm_device *dev,
>   		size_t size);
>   void drmcg_unchg_bo_alloc(struct drmcg *drmcg, struct drm_device *dev,
> @@ -53,6 +59,16 @@ static inline void drmcg_device_early_init(struct drm_device *device)
>   {
>   }
>   
> +static inline void drmcg_register_device_mm(struct drm_device *dev,
> +		unsigned int type, struct work_struct *wq)
> +{
> +}
> +
> +static inline void drmcg_unregister_device_mm(struct drm_device *dev,
> +		unsigned int type)
> +{
> +}
> +
>   static inline void drmcg_try_chg_bo_alloc(struct drmcg *drmcg,
>   		struct drm_device *dev,	size_t size)
>   {
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index e1a805d65b83..529cef92bcf6 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -205,6 +205,8 @@ struct ttm_mem_type_manager {
>   	 * Protected by @move_lock.
>   	 */
>   	struct dma_fence *move;
> +
> +	struct work_struct reclaim_wq;
>   };
>   
>   /**
> diff --git a/kernel/cgroup/drm.c b/kernel/cgroup/drm.c
> index 04fb9a398740..0ea7f0619e25 100644
> --- a/kernel/cgroup/drm.c
> +++ b/kernel/cgroup/drm.c
> @@ -804,6 +804,29 @@ void drmcg_device_early_init(struct drm_device *dev)
>   }
>   EXPORT_SYMBOL(drmcg_device_early_init);
>   
> +void drmcg_register_device_mm(struct drm_device *dev, unsigned int type,
> +		struct work_struct *wq)
> +{
> +	if (dev == NULL || type >= TTM_PL_PRIV)
> +		return;
> +
> +	mutex_lock(&drmcg_mutex);
> +	dev->drmcg_props.mem_reclaim_wq[type] = wq;
> +	mutex_unlock(&drmcg_mutex);
> +}
> +EXPORT_SYMBOL(drmcg_register_device_mm);
> +
> +void drmcg_unregister_device_mm(struct drm_device *dev, unsigned int type)
> +{
> +	if (dev == NULL || type >= TTM_PL_PRIV)
> +		return;
> +
> +	mutex_lock(&drmcg_mutex);
> +	dev->drmcg_props.mem_reclaim_wq[type] = NULL;
> +	mutex_unlock(&drmcg_mutex);
> +}
> +EXPORT_SYMBOL(drmcg_unregister_device_mm);
> +
>   /**
>    * drmcg_try_chg_bo_alloc - charge GEM buffer usage for a device and cgroup
>    * @drmcg: the DRM cgroup to be charged to
> @@ -1013,6 +1036,13 @@ void drmcg_mem_track_move(struct ttm_buffer_object *old_bo, bool evict,
>   
>   		ddr->mem_bw_stats[DRMCG_MEM_BW_ATTR_BYTE_CREDIT]
>   			-= move_in_bytes;
> +
> +		if (dev->drmcg_props.mem_reclaim_wq[new_mem_type]
> +			!= NULL &&
> +			ddr->mem_stats[new_mem_type] >
> +				ddr->mem_highs[new_mem_type])
> +			schedule_work(dev->
> +				drmcg_props.mem_reclaim_wq[new_mem_type]);
>   	}
>   	mutex_unlock(&dev->drmcg_mutex);
>   }

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2019-08-29  7:08 UTC|newest]

Thread overview: 89+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-29  6:05 [PATCH RFC v4 00/16] new cgroup controller for gpu/drm subsystem Kenny Ho
2019-08-29  6:05 ` [PATCH RFC v4 01/16] drm: Add drm_minor_for_each Kenny Ho
     [not found]   ` <20190829060533.32315-2-Kenny.Ho-5C7GfCeVMHo@public.gmane.org>
2019-09-03  7:57     ` Daniel Vetter
2019-09-03 19:45       ` Kenny Ho
     [not found]         ` <CAOWid-dxxDhyxP2+0R0oKAk29rR-1TbMyhshR1+gbcpGJCAW6g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-03 20:12           ` Daniel Vetter
     [not found]             ` <CAKMK7uEofjdVURu+meonh_YdV5eX8vfNALkW3A_+kLapCV8j+w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-03 20:43               ` Kenny Ho
     [not found]                 ` <CAOWid-eUVztW4hNVpznnJRcwHcjCirGL2aS75p4OY8XoGuJqUg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-04  8:54                   ` Daniel Vetter
     [not found]                     ` <20190904085434.GF2112-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2019-09-05 18:27                       ` Kenny Ho
2019-09-05 18:28                       ` Kenny Ho
2019-09-05 20:06                         ` Daniel Vetter
     [not found]                           ` <CAKMK7uGSrscs-WAv0pYfcxaUGXvx7M6JYbiPHTY=1hxRbFK1sg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-05 20:20                             ` Kenny Ho
2019-09-05 20:32                               ` Daniel Vetter
     [not found]                                 ` <CAKMK7uHy+GRAcpLDuz6STCBW+GNfNWr-i=ZERF3uqkO7jfynnQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-05 21:26                                   ` Kenny Ho
     [not found]                                     ` <CAOWid-cRP1T2gr2U_ZN+QhS7jFM0kFTWiYy8JPPXXmGW7xBPzA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-06  9:12                                       ` Daniel Vetter
2019-09-06 15:29                     ` Tejun Heo
2019-09-06 15:36                       ` Daniel Vetter
     [not found]                         ` <CAKMK7uFQqAMB1DbiEy-o2bzr_F25My93imNcg1Qh9DHe=uWQug-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-06 15:38                           ` Tejun Heo
2019-08-29  6:05 ` [PATCH RFC v4 02/16] cgroup: Introduce cgroup for drm subsystem Kenny Ho
     [not found]   ` <20190829060533.32315-3-Kenny.Ho-5C7GfCeVMHo@public.gmane.org>
2019-10-01 14:31     ` Michal Koutný
     [not found]       ` <20191001143106.GA4749-9OudH3eul5jcvrawFnH+a6VXKuFTiq87@public.gmane.org>
2019-11-29  6:00         ` Kenny Ho
2019-11-29  6:00           ` Kenny Ho
2019-11-29  6:00           ` Kenny Ho
2019-11-29  6:00           ` Kenny Ho
     [not found]           ` <CAOWid-ewvs-c-z_WW+Cx=Jaf0p8ZAwkWCkq2E8Xkj+2HvfNjaA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-12-02 19:14             ` Tejun Heo
2019-12-02 19:14               ` Tejun Heo
2019-12-02 19:14               ` Tejun Heo
2019-12-02 19:14               ` Tejun Heo
2019-08-29  6:05 ` [PATCH RFC v4 03/16] drm, cgroup: Initialize drmcg properties Kenny Ho
2019-08-29  6:05 ` [PATCH RFC v4 07/16] drm, cgroup: Add total GEM buffer allocation limit Kenny Ho
     [not found]   ` <20190829060533.32315-8-Kenny.Ho-5C7GfCeVMHo@public.gmane.org>
2019-10-01 14:30     ` Michal Koutný
2019-11-29  7:18       ` Kenny Ho
2019-11-29  7:18         ` Kenny Ho
2019-11-29  7:18         ` Kenny Ho
     [not found] ` <20190829060533.32315-1-Kenny.Ho-5C7GfCeVMHo@public.gmane.org>
2019-08-29  6:05   ` [PATCH RFC v4 04/16] drm, cgroup: Add total GEM buffer allocation stats Kenny Ho
2019-08-29  6:05   ` [PATCH RFC v4 05/16] drm, cgroup: Add peak " Kenny Ho
2019-08-29  6:05   ` [PATCH RFC v4 06/16] drm, cgroup: Add GEM buffer allocation count stats Kenny Ho
2019-08-29  6:05   ` [PATCH RFC v4 08/16] drm, cgroup: Add peak GEM buffer allocation limit Kenny Ho
2019-08-29  6:05   ` [PATCH RFC v4 09/16] drm, cgroup: Add TTM buffer allocation stats Kenny Ho
2019-08-29  6:05   ` [PATCH RFC v4 10/16] drm, cgroup: Add TTM buffer peak usage stats Kenny Ho
2019-08-29  6:05   ` [PATCH RFC v4 11/16] drm, cgroup: Add per cgroup bw measure and control Kenny Ho
     [not found]     ` <20190829060533.32315-12-Kenny.Ho-5C7GfCeVMHo@public.gmane.org>
2019-10-01 14:30       ` Michal Koutný
2019-08-29  6:05   ` [PATCH RFC v4 13/16] drm, cgroup: Allow more aggressive memory reclaim Kenny Ho
2019-08-29  7:08     ` Koenig, Christian [this message]
2019-08-29 14:07       ` Kenny Ho
     [not found]         ` <CAOWid-dzJiqjH9+=36fFYh87OKOzToMDcJZpepOWdjoXpBSF8A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-08-29 14:12           ` Koenig, Christian
     [not found]             ` <f6963293-bebe-0dca-b509-799f9096ca91-5C7GfCeVMHo@public.gmane.org>
2019-08-29 14:39               ` Kenny Ho
2019-08-29  6:05   ` [PATCH RFC v4 15/16] drm, cgroup: add update trigger after limit change Kenny Ho
2019-08-31  4:28   ` [PATCH RFC v4 00/16] new cgroup controller for gpu/drm subsystem Tejun Heo
     [not found]     ` <20190831042857.GD2263813-LpCCV3molIbIZ9tKgghJQw2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2019-09-03  7:55       ` Daniel Vetter
     [not found]         ` <20190903075550.GJ2112-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2019-09-03 18:50           ` Tejun Heo
2019-09-03 19:23             ` Kenny Ho
2019-09-03 19:48             ` Daniel Vetter
     [not found]               ` <CAKMK7uE5Bj-3cJH895iqnLpwUV+GBDM1Y=n4Z4A3xervMdJKXg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-06 15:23                 ` Tejun Heo
     [not found]                   ` <20190906152320.GM2263813-LpCCV3molIbIZ9tKgghJQw2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2019-09-06 15:34                     ` Daniel Vetter
     [not found]                       ` <CAKMK7uEXP7XLFB2aFU6+E0TH_DepFRkfCoKoHwkXtjZRDyhHig-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-09-06 15:45                         ` Tejun Heo
     [not found]                           ` <20190906154539.GP2263813-LpCCV3molIbIZ9tKgghJQw2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2019-09-10 11:54                             ` Michal Hocko
     [not found]                               ` <20190910115448.GT2063-2MMpYkNvuYDjFM9bn6wA6Q@public.gmane.org>
2019-09-10 16:03                                 ` Tejun Heo
2019-09-10 17:25                                   ` Michal Hocko
2019-09-17 12:21                               ` Daniel Vetter
2019-08-29  6:05 ` [PATCH RFC v4 12/16] drm, cgroup: Add soft VRAM limit Kenny Ho
2019-08-29  6:05 ` [PATCH RFC v4 14/16] drm, cgroup: Introduce lgpu as DRM cgroup resource Kenny Ho
     [not found]   ` <20190829060533.32315-15-Kenny.Ho-5C7GfCeVMHo@public.gmane.org>
2019-10-08 18:53     ` Kuehling, Felix
     [not found]       ` <b3d2b3c1-8854-10ca-3e39-b3bef35bdfa9-5C7GfCeVMHo@public.gmane.org>
2019-10-09 10:31         ` Daniel Vetter
     [not found]           ` <20191009103153.GU16989-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2019-10-09 15:08             ` Kenny Ho
     [not found]               ` <CAOWid-fLurBT6-h5WjQsEPA+dq1fgfWztbyZuLV4ypmWH8SC9w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2019-10-09 15:23                 ` Daniel Vetter
2019-10-09 15:25           ` Kuehling, Felix
2019-10-09 15:25             ` Kuehling, Felix
     [not found]             ` <ee873e89-48fd-c4c9-1ce0-73965f4ad2ba-5C7GfCeVMHo@public.gmane.org>
2019-10-09 15:34               ` Daniel Vetter
2019-10-09 15:34                 ` Daniel Vetter
     [not found]                 ` <20191009153429.GI16989-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2019-10-09 15:53                   ` Kuehling, Felix
     [not found]                     ` <c7812af4-7ec4-02bb-ff4c-21dd114cf38e-5C7GfCeVMHo@public.gmane.org>
2019-10-09 16:06                       ` Daniel Vetter
2019-10-09 18:52                         ` Greathouse, Joseph
     [not found]                           ` <CY4PR12MB17670EE9EE4A22663EB584E8F9950-rpdhrqHFk07NeWpHaHeGuQdYzm3356FpvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2019-10-09 19:07                             ` Daniel Vetter
2019-10-11 17:12                         ` tj
     [not found]                           ` <20191011171247.GC18794-LpCCV3molIbIZ9tKgghJQw2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2019-11-29 20:10                             ` Felix Kuehling
2019-11-29 20:10                               ` Felix Kuehling
2019-11-29 20:10                               ` Felix Kuehling
2019-11-29 20:10                               ` Felix Kuehling
2019-08-29  6:05 ` [PATCH RFC v4 16/16] drm/amdgpu: Integrate with DRM cgroup Kenny Ho
     [not found]   ` <20190829060533.32315-17-Kenny.Ho-5C7GfCeVMHo@public.gmane.org>
2019-10-08 19:11     ` Kuehling, Felix
2019-10-08 19:11       ` Kuehling, Felix
     [not found]       ` <04abdc58-ae30-a13d-e7dc-f1020a1400b9-5C7GfCeVMHo@public.gmane.org>
2019-11-29  5:59         ` Kenny Ho
2019-11-29  5:59           ` Kenny Ho
2019-12-02 22:05           ` Greathouse, Joseph
2019-12-03 16:02             ` Kenny Ho
2019-09-03  8:02 ` [PATCH RFC v4 00/16] new cgroup controller for gpu/drm subsystem Daniel Vetter
     [not found]   ` <20190903080217.GL2112-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org>
2019-09-03  8:24     ` Koenig, Christian
2019-09-03  9:19       ` Daniel Vetter
2019-09-03 19:30         ` Kenny Ho

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=464ad318-48dd-3f78-d82b-83a8e7175ff9@amd.com \
    --to=christian.koenig@amd.com \
    --cc=Alexander.Deucher@amd.com \
    --cc=Felix.Kuehling@amd.com \
    --cc=Joseph.Greathouse@amd.com \
    --cc=Kenny.Ho@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=cgroups@vger.kernel.org \
    --cc=daniel@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jsparks@cray.com \
    --cc=lkaplan@cray.com \
    --cc=tj@kernel.org \
    --cc=y2kenny@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.