From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
alan@lxorguk.ukuu.org.uk,
Octavian Purdila <octavian.purdila@intel.com>,
Alan Stern <stern@rowland.harvard.edu>
Subject: [ 042/101] usb hub: send clear_tt_buffer_complete events when canceling TT clear work
Date: Mon, 29 Oct 2012 14:34:55 -0700 [thread overview]
Message-ID: <20121029213244.929625006@linuxfoundation.org> (raw)
In-Reply-To: <20121029213240.128426598@linuxfoundation.org>
3.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Octavian Purdila <octavian.purdila@intel.com>
commit 3b6054da68f9b0d5ed6a7ed0f42a79e61904352c upstream.
There is a race condition in the USB hub code with regard to handling
TT clear requests that can get the HCD driver in a deadlock. Usually
when an TT clear request is scheduled it will be executed immediately:
<7>[ 6.077583] usb 2-1.3: unlink qh1-0e01/f4d4db00 start 0 [1/2 us]
<3>[ 6.078041] usb 2-1: clear tt buffer port 3, a3 ep2 t04048d82
<7>[ 6.078299] hub_tt_work:731
<7>[ 9.309089] usb 2-1.5: link qh1-0e01/f4d506c0 start 0 [1/2 us]
<7>[ 9.324526] ehci_hcd 0000:00:1d.0: reused qh f4d4db00 schedule
<7>[ 9.324539] usb 2-1.3: link qh1-0e01/f4d4db00 start 0 [1/2 us]
<7>[ 9.341530] usb 1-1.1: link qh4-0e01/f397aec0 start 2 [1/2 us]
<7>[ 10.116159] usb 2-1.3: unlink qh1-0e01/f4d4db00 start 0 [1/2 us]
<3>[ 10.116459] usb 2-1: clear tt buffer port 3, a3 ep2 t04048d82
<7>[ 10.116537] hub_tt_work:731
However, if a suspend operation is triggered before hub_tt_work is
scheduled, hub_quiesce will cancel the work without notifying the HCD
driver:
<3>[ 35.033941] usb 2-1: clear tt buffer port 3, a3 ep2 t04048d80
<5>[ 35.034022] sd 0:0:0:0: [sda] Stopping disk
<7>[ 35.034039] hub 2-1:1.0: hub_suspend
<7>[ 35.034067] usb 2-1: unlink qh256-0001/f3b1ab00 start 1 [1/0 us]
<7>[ 35.035085] hub 1-0:1.0: hub_suspend
<7>[ 35.035102] usb usb1: bus suspend, wakeup 0
<7>[ 35.035106] ehci_hcd 0000:00:1a.0: suspend root hub
<7>[ 35.035298] hub 2-0:1.0: hub_suspend
<7>[ 35.035313] usb usb2: bus suspend, wakeup 0
<7>[ 35.035315] ehci_hcd 0000:00:1d.0: suspend root hub
<6>[ 35.250017] PM: suspend of devices complete after 216.979 msecs
<6>[ 35.250822] PM: late suspend of devices complete after 0.799 msecs
<7>[ 35.252343] ehci_hcd 0000:00:1d.0: wakeup: 1
<7>[ 35.262923] ehci_hcd 0000:00:1d.0: --> PCI D3hot
<7>[ 35.263302] ehci_hcd 0000:00:1a.0: wakeup: 1
<7>[ 35.273912] ehci_hcd 0000:00:1a.0: --> PCI D3hot
<6>[ 35.274254] PM: noirq suspend of devices complete after 23.442 msecs
<6>[ 35.274975] ACPI: Preparing to enter system sleep state S3
<6>[ 35.292666] PM: Saving platform NVS memory
<7>[ 35.295030] Disabling non-boot CPUs ...
<6>[ 35.297351] CPU 1 is now offline
<6>[ 35.300345] CPU 2 is now offline
<6>[ 35.303929] CPU 3 is now offline
<7>[ 35.303931] lockdep: fixing up alternatives.
<6>[ 35.304825] Extended CMOS year: 2000
When the device will resume the EHCI driver will get stuck in
ehci_endpoint_disable waiting for the tt_clearing flag to reset:
<0>[ 47.610967] usb 2-1.3: **** DPM device timeout ****
<7>[ 47.610972] f2f11c60 00000092 f2f11c0c c10624a5 00000003 f4c6e880 c1c8a4c0 c1c8a4c0
<7>[ 47.610983] 15c55698 0000000b f56b34c0 f2a45b70 f4c6e880 00000082 f2a4602c f2f11c30
<7>[ 47.610993] c10787f8 f4cac000 f2a45b70 00000000 f4cac010 f2f11c58 00000046 00000001
<7>[ 47.611004] Call Trace:
<7>[ 47.611006] [<c10624a5>] ? sched_clock_cpu+0xf5/0x160
<7>[ 47.611019] [<c10787f8>] ? lock_release_holdtime.part.22+0x88/0xf0
<7>[ 47.611026] [<c103ed46>] ? lock_timer_base.isra.35+0x26/0x50
<7>[ 47.611034] [<c17592d3>] ? schedule_timeout+0x133/0x290
<7>[ 47.611044] [<c175b43e>] schedule+0x1e/0x50
<7>[ 47.611051] [<c17592d8>] schedule_timeout+0x138/0x290
<7>[ 47.611057] [<c10624a5>] ? sched_clock_cpu+0xf5/0x160
<7>[ 47.611063] [<c103e560>] ? usleep_range+0x40/0x40
<7>[ 47.611070] [<c1759445>] schedule_timeout_uninterruptible+0x15/0x20
<7>[ 47.611077] [<c14935f4>] ehci_endpoint_disable+0x64/0x160
<7>[ 47.611084] [<c147d1ee>] ? usb_hcd_flush_endpoint+0x10e/0x1d0
<7>[ 47.611092] [<c1165663>] ? sysfs_add_file+0x13/0x20
<7>[ 47.611100] [<c147d5a9>] usb_hcd_disable_endpoint+0x29/0x40
<7>[ 47.611107] [<c147fafc>] usb_disable_endpoint+0x5c/0x80
<7>[ 47.611111] [<c147fb57>] usb_disable_interface+0x37/0x50
<7>[ 47.611116] [<c1477650>] usb_reset_and_verify_device+0x4b0/0x640
<7>[ 47.611122] [<c1474665>] ? hub_port_status+0xb5/0x100
<7>[ 47.611129] [<c147a975>] usb_port_resume+0xd5/0x220
<7>[ 47.611136] [<c148877f>] generic_resume+0xf/0x30
<7>[ 47.611142] [<c14821a3>] usb_resume+0x133/0x180
<7>[ 47.611147] [<c1473b10>] ? usb_dev_thaw+0x10/0x10
<7>[ 47.611152] [<c1473b1d>] usb_dev_resume+0xd/0x10
<7>[ 47.611157] [<c13baa60>] dpm_run_callback+0x40/0xb0
<7>[ 47.611164] [<c13bdb03>] ? pm_runtime_enable+0x43/0x70
<7>[ 47.611171] [<c13bafc6>] device_resume+0x1a6/0x2c0
<7>[ 47.611177] [<c13ba940>] ? dpm_show_time+0xe0/0xe0
<7>[ 47.611183] [<c13bb0f9>] async_resume+0x19/0x40
<7>[ 47.611189] [<c10580c4>] async_run_entry_fn+0x64/0x160
<7>[ 47.611196] [<c104a244>] ? process_one_work+0x104/0x480
<7>[ 47.611203] [<c104a24c>] ? process_one_work+0x10c/0x480
<7>[ 47.611209] [<c104a2c0>] process_one_work+0x180/0x480
<7>[ 47.611215] [<c104a244>] ? process_one_work+0x104/0x480
<7>[ 47.611220] [<c1058060>] ? async_schedule+0x10/0x10
<7>[ 47.611226] [<c104c15c>] worker_thread+0x11c/0x2f0
<7>[ 47.611233] [<c104c040>] ? manage_workers.isra.27+0x1f0/0x1f0
<7>[ 47.611239] [<c10507f8>] kthread+0x78/0x80
<7>[ 47.611244] [<c1750000>] ? timer_cpu_notify+0xd6/0x20d
<7>[ 47.611253] [<c1050780>] ? __init_kthread_worker+0x60/0x60
<7>[ 47.611258] [<c176357e>] kernel_thread_helper+0x6/0xd
<7>[ 47.611283] ------------[ cut here ]------------
This patch changes hub_quiesce behavior to flush the TT clear work
instead of canceling it, to make sure that no TT clear request remains
uncompleted before suspend.
Signed-off-by: Octavian Purdila <octavian.purdila@intel.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/usb/core/hub.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -730,13 +730,16 @@ static void hub_tt_work(struct work_stru
int limit = 100;
spin_lock_irqsave (&hub->tt.lock, flags);
- while (--limit && !list_empty (&hub->tt.clear_list)) {
+ while (!list_empty(&hub->tt.clear_list)) {
struct list_head *next;
struct usb_tt_clear *clear;
struct usb_device *hdev = hub->hdev;
const struct hc_driver *drv;
int status;
+ if (!hub->quiescing && --limit < 0)
+ break;
+
next = hub->tt.clear_list.next;
clear = list_entry (next, struct usb_tt_clear, clear_list);
list_del (&clear->clear_list);
@@ -1201,7 +1204,7 @@ static void hub_quiesce(struct usb_hub *
if (hub->has_indicators)
cancel_delayed_work_sync(&hub->leds);
if (hub->tt.hub)
- cancel_work_sync(&hub->tt.clear_work);
+ flush_work_sync(&hub->tt.clear_work);
}
/* caller has locked the hub device */
next prev parent reply other threads:[~2012-10-29 22:11 UTC|newest]
Thread overview: 103+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-29 21:34 [ 000/101] 3.6.5-stable review Greg Kroah-Hartman
2012-10-29 21:34 ` [ 001/101] drm/radeon: add some new SI PCI ids Greg Kroah-Hartman
2012-10-29 21:34 ` [ 002/101] drm/radeon: add error output if VM CS fails on cayman Greg Kroah-Hartman
2012-10-29 21:34 ` [ 003/101] ALSA: hda - add dock support for Thinkpad T430 Greg Kroah-Hartman
2012-10-29 21:34 ` [ 004/101] ALSA: hda - Fix silent headphone output from Toshiba P200 Greg Kroah-Hartman
2012-10-29 21:34 ` [ 005/101] VFS: dont do protected {sym,hard}links by default Greg Kroah-Hartman
2012-10-29 21:34 ` [ 006/101] gen_init_cpio: avoid stack overflow when expanding Greg Kroah-Hartman
2012-10-29 21:34 ` [ 007/101] fs/compat_ioctl.c: VIDEO_SET_SPU_PALETTE missing error check Greg Kroah-Hartman
2012-10-29 21:34 ` [ 008/101] drivers/rtc/rtc-imxdi.c: add missing spin lock initialization Greg Kroah-Hartman
2012-10-29 21:34 ` [ 009/101] genalloc: stop crashing the system when destroying a pool Greg Kroah-Hartman
2012-10-29 21:34 ` [ 010/101] ARM: 7559/1: smp: switch away from the idmap before updating init_mm.mm_count Greg Kroah-Hartman
2012-10-29 21:34 ` [ 011/101] x86-64: Fix page table accounting Greg Kroah-Hartman
2012-10-29 21:34 ` [ 012/101] Revert "x86/mm: Fix the size calculation of mapping tables" Greg Kroah-Hartman
2012-10-29 21:34 ` [ 013/101] x86, mm: Trim memory in memblock to be page aligned Greg Kroah-Hartman
2012-10-29 21:34 ` [ 014/101] mm: fix XFS oops due to dirty pages without buffers on s390 Greg Kroah-Hartman
2012-10-29 21:34 ` [ 015/101] SUNRPC: Get rid of the xs_error_report socket callback Greg Kroah-Hartman
2012-10-29 21:34 ` [ 016/101] SUNRPC: Clear the connect flag when socket state is TCP_CLOSE_WAIT Greg Kroah-Hartman
2012-10-29 21:34 ` [ 017/101] Revert "SUNRPC: Ensure we close the socket on EPIPE errors too..." Greg Kroah-Hartman
2012-10-29 21:34 ` [ 018/101] LOCKD: fix races in nsm_client_get Greg Kroah-Hartman
2012-10-29 21:34 ` [ 019/101] SUNRPC: Prevent races in xs_abort_connection() Greg Kroah-Hartman
2012-10-29 21:34 ` [ 020/101] LOCKD: Clear ln->nsm_clnt only when ln->nsm_users is zero Greg Kroah-Hartman
2012-10-29 21:34 ` [ 021/101] xhci: Fix potential NULL ptr deref in command cancellation Greg Kroah-Hartman
2012-10-29 21:34 ` [ 022/101] xhci: fix integer overflow Greg Kroah-Hartman
2012-10-29 21:34 ` [ 023/101] xhci: endianness xhci_calculate_intel_u2_timeout Greg Kroah-Hartman
2012-10-29 21:34 ` [ 024/101] sysfs: sysfs_pathname/sysfs_add_one: Use strlcat() instead of strcat() Greg Kroah-Hartman
2012-10-29 21:34 ` [ 025/101] Staging: android: binder: Fix memory leak on thread/process exit Greg Kroah-Hartman
2012-10-29 21:34 ` [ 026/101] Staging: android: binder: Allow using highmem for binder buffers Greg Kroah-Hartman
2012-10-29 21:34 ` [ 027/101] staging: zram: Fix handling of incompressible pages Greg Kroah-Hartman
2012-10-29 21:34 ` [ 028/101] staging: comedi: das08: fix possible NULL deref during detach Greg Kroah-Hartman
2012-10-29 21:34 ` [ 029/101] staging: comedi: ni_daq_700: fix dio subdevice regression Greg Kroah-Hartman
2012-10-29 21:34 ` [ 030/101] staging: comedi: ni_labpc: fix possible NULL deref during detach Greg Kroah-Hartman
2012-10-29 21:34 ` [ 031/101] staging: comedi: amplc_dio200: " Greg Kroah-Hartman
2012-10-29 21:34 ` [ 032/101] staging: comedi: amplc_pc263: " Greg Kroah-Hartman
2012-10-29 21:34 ` [ 033/101] staging: comedi: amplc_pc236: fix invalid register access " Greg Kroah-Hartman
2012-10-29 21:34 ` [ 034/101] staging: comedi: amplc_pc236: fix possible NULL deref " Greg Kroah-Hartman
2012-10-29 21:34 ` [ 035/101] extcon: Unregister compat class at module unload to fix oops Greg Kroah-Hartman
2012-10-29 21:34 ` [ 036/101] extcon: unregister compat link on cleanup Greg Kroah-Hartman
2012-10-29 21:34 ` [ 037/101] Drivers: hv: Cleanup error handling in vmbus_open() Greg Kroah-Hartman
2012-10-29 21:34 ` [ 038/101] ehci: fix Lucid nohandoff pci quirk to be more generic with BIOS versions Greg Kroah-Hartman
2012-10-29 21:34 ` [ 039/101] ehci: Add yet-another Lucid nohandoff pci quirk Greg Kroah-Hartman
2012-10-29 21:34 ` [ 040/101] usb-storage: add unusual_devs entry for Casio EX-N1 digital camera Greg Kroah-Hartman
2012-10-29 21:34 ` [ 041/101] USB: usb-wwan: fix multiple memory leaks in error paths Greg Kroah-Hartman
2012-10-29 21:34 ` Greg Kroah-Hartman [this message]
2012-10-29 21:34 ` [ 043/101] USB: ch341: fix port-data memory leak Greg Kroah-Hartman
2012-10-29 21:34 ` [ 044/101] USB: digi_acceleport: " Greg Kroah-Hartman
2012-10-29 21:34 ` [ 045/101] USB: ipw: fix interface-data memory leak in error path Greg Kroah-Hartman
2012-10-29 21:34 ` [ 046/101] USB: mct_u232: fix port-data memory leak Greg Kroah-Hartman
2012-10-29 21:35 ` [ 047/101] USB: mct_u232: fix broken close Greg Kroah-Hartman
2012-10-29 21:35 ` [ 048/101] USB: option: fix interface-data memory leak in error path Greg Kroah-Hartman
2012-10-29 21:35 ` [ 049/101] USB: keyspan: fix NULL-pointer dereferences and memory leaks Greg Kroah-Hartman
2012-10-29 21:35 ` [ 050/101] USB: omninet: fix port-data memory leak Greg Kroah-Hartman
2012-10-29 21:35 ` [ 051/101] USB: qcserial: fix interface-data memory leak in error path Greg Kroah-Hartman
2012-10-29 21:35 ` [ 052/101] USB: whiteheat: fix " Greg Kroah-Hartman
2012-10-29 21:35 ` [ 053/101] USB: whiteheat: fix port-data memory leak Greg Kroah-Hartman
2012-10-29 21:35 ` [ 054/101] USB: opticon: fix DMA from stack Greg Kroah-Hartman
2012-10-29 21:35 ` [ 055/101] USB: opticon: fix memory leak in error path Greg Kroah-Hartman
2012-10-29 21:35 ` [ 056/101] USB: metro-usb: fix port-data memory leak Greg Kroah-Hartman
2012-10-29 21:35 ` [ 057/101] USB: metro-usb: fix io after disconnect Greg Kroah-Hartman
2012-10-29 21:35 ` [ 058/101] USB: mos7720: fix port-data memory leak Greg Kroah-Hartman
2012-10-29 21:35 ` [ 059/101] USB: quatech2: fix memory leak in error path Greg Kroah-Hartman
2012-10-29 21:35 ` [ 060/101] USB: quatech2: fix port-data memory leaks Greg Kroah-Hartman
2012-10-29 21:35 ` [ 061/101] USB: quatech2: fix close and disconnect urb handling Greg Kroah-Hartman
2012-10-29 21:35 ` [ 062/101] USB: quatech2: fix io after disconnect Greg Kroah-Hartman
2012-10-29 21:35 ` [ 063/101] USB: serial: Fix memory leak in sierra_release() Greg Kroah-Hartman
2012-10-29 21:35 ` [ 064/101] USB: sierra: fix memory leak in attach error path Greg Kroah-Hartman
2012-10-29 21:35 ` [ 065/101] USB: sierra: fix memory leak in probe " Greg Kroah-Hartman
2012-10-29 21:35 ` [ 066/101] USB: sierra: fix port-data memory leak Greg Kroah-Hartman
2012-10-29 21:35 ` [ 067/101] USB: mos7840: fix urb leak at release Greg Kroah-Hartman
2012-10-29 21:35 ` [ 068/101] USB: mos7840: fix port-device leak in error path Greg Kroah-Hartman
2012-10-29 21:35 ` [ 069/101] USB: mos7840: remove NULL-urb submission Greg Kroah-Hartman
2012-10-29 21:35 ` [ 070/101] USB: mos7840: remove invalid disconnect handling Greg Kroah-Hartman
2012-10-29 21:35 ` [ 071/101] vhost: fix mergeable bufs on BE hosts Greg Kroah-Hartman
2012-10-29 21:35 ` [ 072/101] ARM: SAMSUNG: Add naming of s3c64xx-spi devices Greg Kroah-Hartman
2012-10-29 21:35 ` [ 073/101] ARM: at91/tc: fix typo in the DT document Greg Kroah-Hartman
2012-10-29 21:35 ` [ 074/101] ARM: at91/i2c: change id to let i2c-gpio work Greg Kroah-Hartman
2012-10-29 21:35 ` [ 075/101] ARM: at91: at91sam9g10: fix SOC type detection Greg Kroah-Hartman
2012-10-29 21:35 ` [ 076/101] ARM: at91: fix external interrupts in non-DT case Greg Kroah-Hartman
2012-10-29 21:35 ` [ 077/101] ARM: at91: fix external interrupt specification in board code Greg Kroah-Hartman
2012-10-29 21:35 ` [ 078/101] mac80211: connect with HT20 if HT40 is not permitted Greg Kroah-Hartman
2012-10-29 21:35 ` [ 079/101] mac80211: check if key has TKIP type before updating IV Greg Kroah-Hartman
2012-10-29 21:35 ` [ 080/101] mac80211: use ieee80211_free_txskb in a few more places Greg Kroah-Hartman
2012-10-29 21:35 ` [ 081/101] b43: Fix oops on unload when firmware not found Greg Kroah-Hartman
2012-10-29 21:35 ` [ 082/101] tilegx: fix some issues in the SW TSO support Greg Kroah-Hartman
2012-10-29 21:35 ` [ 083/101] Bluetooth: SMP: Fix setting unknown auth_req bits Greg Kroah-Hartman
2012-10-29 21:35 ` [ 084/101] qmi_wwan/cdc_ether: move Novatel 551 and E362 to qmi_wwan Greg Kroah-Hartman
2012-10-29 21:35 ` [ 085/101] freezer: exec should clear PF_NOFREEZE along with PF_KTHREAD Greg Kroah-Hartman
2012-10-29 21:35 ` [ 086/101] dmaengine: sirf: fix a typo in dma_prep_interleaved Greg Kroah-Hartman
2012-10-29 21:35 ` [ 087/101] dmaengine: sirf: fix a typo in moving running dma_desc to active queue Greg Kroah-Hartman
2012-10-29 21:35 ` [ 088/101] dmaengine: imx-dma: fix missing unlock on error in imxdma_xfer_desc() Greg Kroah-Hartman
2012-10-29 21:35 ` [ 089/101] iwlwifi: fix 6000 series channel switch command Greg Kroah-Hartman
2012-10-29 21:35 ` [ 090/101] bcma: fix unregistration of cores Greg Kroah-Hartman
2012-10-29 21:35 ` [ 091/101] net/wireless: ipw2200: Fix panic occurring in ipw_handle_promiscuous_tx() Greg Kroah-Hartman
2012-10-29 21:35 ` [ 092/101] cpufreq / powernow-k8: Remove usage of smp_processor_id() in preemptible code Greg Kroah-Hartman
2012-10-29 21:35 ` [ 093/101] Revert "ath9k_hw: Updated AR9003 tx gain table for 5GHz" Greg Kroah-Hartman
2012-10-29 21:35 ` [ 094/101] x86, mm: Find_early_table_space based on ranges that are actually being mapped Greg Kroah-Hartman
2012-10-29 21:35 ` [ 095/101] x86, mm: Undo incorrect revert in arch/x86/mm/init.c Greg Kroah-Hartman
2012-10-29 21:35 ` [ 096/101] cfg80211/mac80211: avoid state mishmash on deauth Greg Kroah-Hartman
2012-10-29 21:35 ` [ 097/101] efi: Defer freeing boot services memory until after ACPI init Greg Kroah-Hartman
2012-10-29 21:35 ` [ 098/101] x86: efi: Turn off efi_enabled after setup on mixed fw/kernel Greg Kroah-Hartman
2012-10-29 21:35 ` [ 099/101] x86, mm: Use memblock memory loop instead of e820_RAM Greg Kroah-Hartman
2012-10-29 21:35 ` [ 100/101] pnfsblock: fix non-aligned DIO read Greg Kroah-Hartman
2012-10-29 21:35 ` [ 101/101] pnfsblock: fix non-aligned DIO write Greg Kroah-Hartman
2012-10-30 9:38 ` [PATCH] USB: io_edgeport: remove unused variable Paul Bolle
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=20121029213244.929625006@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=octavian.purdila@intel.com \
--cc=stable@vger.kernel.org \
--cc=stern@rowland.harvard.edu \
/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.