From: Daniel Vetter <daniel@ffwll.ch> To: Lyude Paul <lyude@redhat.com> Cc: dri-devel@lists.freedesktop.org, "Juston Li" <juston.li@intel.com>, "Imre Deak" <imre.deak@intel.com>, "Ville Syrjälä" <ville.syrjala@linux.intel.com>, "Harry Wentland" <hwentlan@amd.com>, "Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>, "Maxime Ripard" <maxime.ripard@bootlin.com>, "Sean Paul" <sean@poorly.run>, "David Airlie" <airlied@linux.ie>, "Daniel Vetter" <daniel@ffwll.ch>, linux-kernel@vger.kernel.org Subject: Re: [PATCH 09/26] drm/dp_mst: Remove huge conditional in drm_dp_mst_handle_up_req() Date: Tue, 13 Aug 2019 16:56:20 +0200 [thread overview] Message-ID: <20190813145620.GY7444@phenom.ffwll.local> (raw) In-Reply-To: <20190718014329.8107-10-lyude@redhat.com> On Wed, Jul 17, 2019 at 09:42:32PM -0400, Lyude Paul wrote: > Which reduces indentation and makes this function more legible. Indeed, nice one. Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> > > Cc: Juston Li <juston.li@intel.com> > Cc: Imre Deak <imre.deak@intel.com> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Cc: Harry Wentland <hwentlan@amd.com> > Signed-off-by: Lyude Paul <lyude@redhat.com> > --- > drivers/gpu/drm/drm_dp_mst_topology.c | 90 +++++++++++++-------------- > 1 file changed, 45 insertions(+), 45 deletions(-) > > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c > index 57c9c605ee17..b867a2e8f779 100644 > --- a/drivers/gpu/drm/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c > @@ -3126,7 +3126,9 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr) > > static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) > { > - int ret = 0; > + struct drm_dp_sideband_msg_req_body msg; > + struct drm_dp_mst_branch *mstb = NULL; > + bool seqno; > > if (!drm_dp_get_one_sb_msg(mgr, true)) { > memset(&mgr->up_req_recv, 0, > @@ -3134,62 +3136,60 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) > return 0; > } > > - if (mgr->up_req_recv.have_eomt) { > - struct drm_dp_sideband_msg_req_body msg; > - struct drm_dp_mst_branch *mstb = NULL; > - bool seqno; > - > - if (!mgr->up_req_recv.initial_hdr.broadcast) { > - mstb = drm_dp_get_mst_branch_device(mgr, > - mgr->up_req_recv.initial_hdr.lct, > - mgr->up_req_recv.initial_hdr.rad); > - if (!mstb) { > - DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > - memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > - return 0; > - } > - } > + if (!mgr->up_req_recv.have_eomt) > + return 0; > > - seqno = mgr->up_req_recv.initial_hdr.seqno; > - drm_dp_sideband_parse_req(&mgr->up_req_recv, &msg); > + if (!mgr->up_req_recv.initial_hdr.broadcast) { > + mstb = drm_dp_get_mst_branch_device(mgr, > + mgr->up_req_recv.initial_hdr.lct, > + mgr->up_req_recv.initial_hdr.rad); > + if (!mstb) { > + DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > + memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + return 0; > + } > + } > > - if (msg.req_type == DP_CONNECTION_STATUS_NOTIFY) { > - drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); > + seqno = mgr->up_req_recv.initial_hdr.seqno; > + drm_dp_sideband_parse_req(&mgr->up_req_recv, &msg); > > - if (!mstb) > - mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); > + if (msg.req_type == DP_CONNECTION_STATUS_NOTIFY) { > + drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); > > - if (!mstb) { > - DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > - memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > - return 0; > - } > + if (!mstb) > + mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); > > - drm_dp_update_port(mstb, &msg.u.conn_stat); > + if (!mstb) { > + DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > + memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + return 0; > + } > > - DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type); > - drm_kms_helper_hotplug_event(mgr->dev); > + drm_dp_update_port(mstb, &msg.u.conn_stat); > > - } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) { > - drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); > - if (!mstb) > - mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); > + DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type); > + drm_kms_helper_hotplug_event(mgr->dev); > > - if (!mstb) { > - DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > - memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > - return 0; > - } > + } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) { > + drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); > + if (!mstb) > + mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); > > - DRM_DEBUG_KMS("Got RSN: pn: %d avail_pbn %d\n", msg.u.resource_stat.port_number, msg.u.resource_stat.available_pbn); > + if (!mstb) { > + DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > + memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + return 0; > } > > - if (mstb) > - drm_dp_mst_topology_put_mstb(mstb); > - > - memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + DRM_DEBUG_KMS("Got RSN: pn: %d avail_pbn %d\n", msg.u.resource_stat.port_number, msg.u.resource_stat.available_pbn); > } > - return ret; > + > + if (mstb) > + drm_dp_mst_topology_put_mstb(mstb); > + > + memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + > + return 0; > } > > /** > -- > 2.21.0 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch
WARNING: multiple messages have this Message-ID (diff)
From: Daniel Vetter <daniel@ffwll.ch> To: Lyude Paul <lyude@redhat.com> Cc: Maxime Ripard <maxime.ripard@bootlin.com>, Sean Paul <sean@poorly.run>, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>, Juston Li <juston.li@intel.com>, Harry Wentland <hwentlan@amd.com> Subject: Re: [PATCH 09/26] drm/dp_mst: Remove huge conditional in drm_dp_mst_handle_up_req() Date: Tue, 13 Aug 2019 16:56:20 +0200 [thread overview] Message-ID: <20190813145620.GY7444@phenom.ffwll.local> (raw) In-Reply-To: <20190718014329.8107-10-lyude@redhat.com> On Wed, Jul 17, 2019 at 09:42:32PM -0400, Lyude Paul wrote: > Which reduces indentation and makes this function more legible. Indeed, nice one. Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> > > Cc: Juston Li <juston.li@intel.com> > Cc: Imre Deak <imre.deak@intel.com> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com> > Cc: Harry Wentland <hwentlan@amd.com> > Signed-off-by: Lyude Paul <lyude@redhat.com> > --- > drivers/gpu/drm/drm_dp_mst_topology.c | 90 +++++++++++++-------------- > 1 file changed, 45 insertions(+), 45 deletions(-) > > diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c > index 57c9c605ee17..b867a2e8f779 100644 > --- a/drivers/gpu/drm/drm_dp_mst_topology.c > +++ b/drivers/gpu/drm/drm_dp_mst_topology.c > @@ -3126,7 +3126,9 @@ static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr) > > static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) > { > - int ret = 0; > + struct drm_dp_sideband_msg_req_body msg; > + struct drm_dp_mst_branch *mstb = NULL; > + bool seqno; > > if (!drm_dp_get_one_sb_msg(mgr, true)) { > memset(&mgr->up_req_recv, 0, > @@ -3134,62 +3136,60 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) > return 0; > } > > - if (mgr->up_req_recv.have_eomt) { > - struct drm_dp_sideband_msg_req_body msg; > - struct drm_dp_mst_branch *mstb = NULL; > - bool seqno; > - > - if (!mgr->up_req_recv.initial_hdr.broadcast) { > - mstb = drm_dp_get_mst_branch_device(mgr, > - mgr->up_req_recv.initial_hdr.lct, > - mgr->up_req_recv.initial_hdr.rad); > - if (!mstb) { > - DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > - memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > - return 0; > - } > - } > + if (!mgr->up_req_recv.have_eomt) > + return 0; > > - seqno = mgr->up_req_recv.initial_hdr.seqno; > - drm_dp_sideband_parse_req(&mgr->up_req_recv, &msg); > + if (!mgr->up_req_recv.initial_hdr.broadcast) { > + mstb = drm_dp_get_mst_branch_device(mgr, > + mgr->up_req_recv.initial_hdr.lct, > + mgr->up_req_recv.initial_hdr.rad); > + if (!mstb) { > + DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > + memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + return 0; > + } > + } > > - if (msg.req_type == DP_CONNECTION_STATUS_NOTIFY) { > - drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); > + seqno = mgr->up_req_recv.initial_hdr.seqno; > + drm_dp_sideband_parse_req(&mgr->up_req_recv, &msg); > > - if (!mstb) > - mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); > + if (msg.req_type == DP_CONNECTION_STATUS_NOTIFY) { > + drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); > > - if (!mstb) { > - DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > - memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > - return 0; > - } > + if (!mstb) > + mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.conn_stat.guid); > > - drm_dp_update_port(mstb, &msg.u.conn_stat); > + if (!mstb) { > + DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > + memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + return 0; > + } > > - DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type); > - drm_kms_helper_hotplug_event(mgr->dev); > + drm_dp_update_port(mstb, &msg.u.conn_stat); > > - } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) { > - drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); > - if (!mstb) > - mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); > + DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type); > + drm_kms_helper_hotplug_event(mgr->dev); > > - if (!mstb) { > - DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > - memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > - return 0; > - } > + } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) { > + drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); > + if (!mstb) > + mstb = drm_dp_get_mst_branch_device_by_guid(mgr, msg.u.resource_stat.guid); > > - DRM_DEBUG_KMS("Got RSN: pn: %d avail_pbn %d\n", msg.u.resource_stat.port_number, msg.u.resource_stat.available_pbn); > + if (!mstb) { > + DRM_DEBUG_KMS("Got MST reply from unknown device %d\n", mgr->up_req_recv.initial_hdr.lct); > + memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + return 0; > } > > - if (mstb) > - drm_dp_mst_topology_put_mstb(mstb); > - > - memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + DRM_DEBUG_KMS("Got RSN: pn: %d avail_pbn %d\n", msg.u.resource_stat.port_number, msg.u.resource_stat.available_pbn); > } > - return ret; > + > + if (mstb) > + drm_dp_mst_topology_put_mstb(mstb); > + > + memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx)); > + > + return 0; > } > > /** > -- > 2.21.0 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2019-08-13 14:56 UTC|newest] Thread overview: 66+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-07-18 1:42 [PATCH 00/26] DP MST Refactors + debugging tools + suspend/resume reprobing Lyude Paul 2019-07-18 1:42 ` [PATCH 01/26] drm/dp_mst: Move link address dumping into a function Lyude Paul 2019-08-08 19:53 ` Daniel Vetter 2019-08-08 19:53 ` Daniel Vetter 2019-08-26 21:51 ` Lyude Paul 2019-08-27 16:16 ` Daniel Vetter 2019-07-18 1:42 ` [PATCH 02/26] drm/dp_mst: Destroy mstbs from destroy_connector_work Lyude Paul 2019-08-13 13:00 ` Daniel Vetter 2019-08-26 22:07 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 03/26] drm/dp_mst: Move test_calc_pbn_mode() into an actual selftest Lyude Paul 2019-08-13 13:01 ` Daniel Vetter 2019-07-18 1:42 ` [PATCH 04/26] drm/print: Add drm_err_printer() Lyude Paul 2019-08-13 13:04 ` Daniel Vetter 2019-08-13 13:04 ` Daniel Vetter 2019-07-18 1:42 ` [PATCH 05/26] drm/dp_mst: Add sideband down request tracing + selftests Lyude Paul 2019-08-13 14:50 ` Daniel Vetter 2019-08-13 14:50 ` Daniel Vetter 2019-08-27 16:43 ` Lyude Paul 2019-08-27 16:43 ` Lyude Paul 2019-08-27 16:49 ` Lyude Paul 2019-08-27 17:15 ` Daniel Vetter 2019-08-27 17:15 ` Daniel Vetter 2019-08-31 0:31 ` Lyude Paul 2019-09-03 7:40 ` Daniel Vetter 2019-07-18 1:42 ` [PATCH 06/26] drm/dp_mst: Move PDT teardown for ports into destroy_connector_work Lyude Paul 2019-08-13 14:52 ` Daniel Vetter 2019-08-13 14:52 ` Daniel Vetter 2019-08-30 23:46 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 07/26] drm/dp_mst: Get rid of list clear in drm_dp_finish_destroy_port() Lyude Paul 2019-08-13 14:55 ` Daniel Vetter 2019-07-18 1:42 ` [PATCH 08/26] drm/dp_mst: Refactor drm_dp_send_enum_path_resources Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-08-14 15:05 ` Daniel Vetter 2019-07-18 1:42 ` [PATCH 09/26] drm/dp_mst: Remove huge conditional in drm_dp_mst_handle_up_req() Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-08-13 14:56 ` Daniel Vetter [this message] 2019-08-13 14:56 ` Daniel Vetter 2019-07-18 1:42 ` [PATCH 10/26] drm/dp_mst: Constify guid in drm_dp_get_mst_branch_by_guid() Lyude Paul 2019-07-18 1:42 ` [PATCH 11/26] drm/dp_mst: Refactor drm_dp_mst_handle_up_req() Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 12/26] drm/dp_mst: Refactor drm_dp_mst_handle_down_rep() Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 13/26] drm/dp_mst: Destroy topology_mgr mutexes Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 14/26] drm/dp_mst: Cleanup drm_dp_send_link_address() a bit Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 15/26] drm/dp_mst: Refactor pdt setup/teardown, add more locking Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 16/26] drm/dp_mst: Rename drm_dp_add_port and drm_dp_update_port Lyude Paul 2019-07-18 1:42 ` [PATCH 17/26] drm/dp_mst: Remove lies in {up,down}_rep_recv documentation Lyude Paul 2019-07-18 1:42 ` [PATCH 18/26] drm/dp_mst: Handle UP requests asynchronously Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 19/26] drm/dp_mst: Protect drm_dp_mst_port members with connection_mutex Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 20/26] drm/dp_mst: Don't forget to update port->input in drm_dp_mst_handle_conn_stat() Lyude Paul 2019-07-18 1:42 ` [PATCH 21/26] drm/nouveau: Don't grab runtime PM refs for HPD IRQs Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 22/26] drm/amdgpu: Iterate through DRM connectors correctly Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 23/26] drm/amdgpu/dm: Resume short HPD IRQs before resuming MST topology Lyude Paul 2019-07-18 1:42 ` [PATCH 24/26] drm/dp_mst: Add basic topology reprobing when resuming Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 25/26] drm/dp_mst: Also print unhashed pointers for malloc/topology references Lyude Paul 2019-07-18 1:42 ` Lyude Paul 2019-07-18 1:42 ` [PATCH 26/26] drm/dp_mst: Add topology ref history tracking for debugging Lyude Paul 2019-07-18 1:42 ` Lyude Paul
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=20190813145620.GY7444@phenom.ffwll.local \ --to=daniel@ffwll.ch \ --cc=airlied@linux.ie \ --cc=dri-devel@lists.freedesktop.org \ --cc=hwentlan@amd.com \ --cc=imre.deak@intel.com \ --cc=juston.li@intel.com \ --cc=linux-kernel@vger.kernel.org \ --cc=lyude@redhat.com \ --cc=maarten.lankhorst@linux.intel.com \ --cc=maxime.ripard@bootlin.com \ --cc=sean@poorly.run \ --cc=ville.syrjala@linux.intel.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: linkBe 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.