All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Hansen <dave@sr71.net>
To: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Hugh Dickins <hughd@google.com>,
	Wu Fengguang <fengguang.wu@intel.com>, Jan Kara <jack@suse.cz>,
	Mel Gorman <mgorman@suse.de>,
	linux-mm@kvack.org, Andi Kleen <ak@linux.intel.com>,
	Matthew Wilcox <matthew.r.wilcox@intel.com>,
	"Kirill A. Shutemov" <kirill@shutemov.name>,
	Hillf Danton <dhillf@gmail.com>,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCHv4 15/39] thp, mm: trigger bug in replace_page_cache_page() on THP
Date: Tue, 21 May 2013 13:17:32 -0700	[thread overview]
Message-ID: <519BD65C.1050709@sr71.net> (raw)
In-Reply-To: <1368321816-17719-16-git-send-email-kirill.shutemov@linux.intel.com>

On 05/11/2013 06:23 PM, Kirill A. Shutemov wrote:
> From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
> 
> replace_page_cache_page() is only used by FUSE. It's unlikely that we
> will support THP in FUSE page cache any soon.
> 
> Let's pospone implemetation of THP handling in replace_page_cache_page()
> until any will use it.
...
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 657ce82..3a03426 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -428,6 +428,8 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask)
>  {
>  	int error;
>  
> +	VM_BUG_ON(PageTransHuge(old));
> +	VM_BUG_ON(PageTransHuge(new));
>  	VM_BUG_ON(!PageLocked(old));
>  	VM_BUG_ON(!PageLocked(new));
>  	VM_BUG_ON(new->mapping);

The code calling replace_page_cache_page() has a bunch of fallback and
error returning code.  It seems a little bit silly to bring the whole
machine down when you could just WARN_ONCE() and return an error code
like fuse already does:

>         /*
>          * This is a new and locked page, it shouldn't be mapped or
>          * have any special flags on it
>          */
>         if (WARN_ON(page_mapped(oldpage)))
>                 goto out_fallback_unlock;
>         if (WARN_ON(page_has_private(oldpage)))
>                 goto out_fallback_unlock;
>         if (WARN_ON(PageDirty(oldpage) || PageWriteback(oldpage)))
>                 goto out_fallback_unlock;
>         if (WARN_ON(PageMlocked(oldpage)))
>                 goto out_fallback_unlock;

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Dave Hansen <dave@sr71.net>
To: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Al Viro <viro@zeniv.linux.org.uk>,
	Hugh Dickins <hughd@google.com>,
	Wu Fengguang <fengguang.wu@intel.com>, Jan Kara <jack@suse.cz>,
	Mel Gorman <mgorman@suse.de>,
	linux-mm@kvack.org, Andi Kleen <ak@linux.intel.com>,
	Matthew Wilcox <matthew.r.wilcox@intel.com>,
	"Kirill A. Shutemov" <kirill@shutemov.name>,
	Hillf Danton <dhillf@gmail.com>,
	linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCHv4 15/39] thp, mm: trigger bug in replace_page_cache_page() on THP
Date: Tue, 21 May 2013 13:17:32 -0700	[thread overview]
Message-ID: <519BD65C.1050709@sr71.net> (raw)
In-Reply-To: <1368321816-17719-16-git-send-email-kirill.shutemov@linux.intel.com>

On 05/11/2013 06:23 PM, Kirill A. Shutemov wrote:
> From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
> 
> replace_page_cache_page() is only used by FUSE. It's unlikely that we
> will support THP in FUSE page cache any soon.
> 
> Let's pospone implemetation of THP handling in replace_page_cache_page()
> until any will use it.
...
> diff --git a/mm/filemap.c b/mm/filemap.c
> index 657ce82..3a03426 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -428,6 +428,8 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask)
>  {
>  	int error;
>  
> +	VM_BUG_ON(PageTransHuge(old));
> +	VM_BUG_ON(PageTransHuge(new));
>  	VM_BUG_ON(!PageLocked(old));
>  	VM_BUG_ON(!PageLocked(new));
>  	VM_BUG_ON(new->mapping);

The code calling replace_page_cache_page() has a bunch of fallback and
error returning code.  It seems a little bit silly to bring the whole
machine down when you could just WARN_ONCE() and return an error code
like fuse already does:

>         /*
>          * This is a new and locked page, it shouldn't be mapped or
>          * have any special flags on it
>          */
>         if (WARN_ON(page_mapped(oldpage)))
>                 goto out_fallback_unlock;
>         if (WARN_ON(page_has_private(oldpage)))
>                 goto out_fallback_unlock;
>         if (WARN_ON(PageDirty(oldpage) || PageWriteback(oldpage)))
>                 goto out_fallback_unlock;
>         if (WARN_ON(PageMlocked(oldpage)))
>                 goto out_fallback_unlock;


  reply	other threads:[~2013-05-21 20:17 UTC|newest]

Thread overview: 243+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-12  1:22 [PATCHv4 00/39] Transparent huge page cache Kirill A. Shutemov
2013-05-12  1:22 ` Kirill A. Shutemov
2013-05-12  1:22 ` [PATCHv4 01/39] mm: drop actor argument of do_generic_file_read() Kirill A. Shutemov
2013-05-12  1:22   ` Kirill A. Shutemov
2013-05-21 18:22   ` Dave Hansen
2013-05-21 18:22     ` Dave Hansen
2013-05-12  1:22 ` [PATCHv4 02/39] block: implement add_bdi_stat() Kirill A. Shutemov
2013-05-12  1:22   ` Kirill A. Shutemov
2013-05-21 18:25   ` Dave Hansen
2013-05-21 18:25     ` Dave Hansen
2013-05-22 11:06     ` Kirill A. Shutemov
2013-05-22 11:06       ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 03/39] mm: implement zero_huge_user_segment and friends Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-23 10:32   ` Hillf Danton
2013-05-23 10:32     ` Hillf Danton
2013-05-23 11:32     ` Kirill A. Shutemov
2013-05-23 11:32       ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 04/39] radix-tree: implement preload for multiple contiguous elements Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 18:58   ` Dave Hansen
2013-05-21 18:58     ` Dave Hansen
2013-05-22 12:03     ` Kirill A. Shutemov
2013-05-22 12:03       ` Kirill A. Shutemov
2013-05-22 14:20       ` Dave Hansen
2013-05-22 14:20         ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 05/39] memcg, thp: charge huge cache pages Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 19:04   ` Dave Hansen
2013-05-21 19:04     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 06/39] thp, mm: avoid PageUnevictable on active/inactive lru lists Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 19:17   ` Dave Hansen
2013-05-21 19:17     ` Dave Hansen
2013-05-22 12:34     ` Kirill A. Shutemov
2013-05-22 12:34       ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 07/39] thp, mm: basic defines for transparent huge page cache Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-23 10:36   ` Hillf Danton
2013-05-23 10:36     ` Hillf Danton
2013-05-23 15:49     ` Dave Hansen
2013-05-23 15:49       ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 08/39] thp: compile-time and sysfs knob for thp pagecache Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-22 11:19   ` Hillf Danton
2013-05-22 11:19     ` Hillf Danton
2013-05-12  1:23 ` [PATCHv4 09/39] thp, mm: introduce mapping_can_have_hugepages() predicate Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 19:28   ` Dave Hansen
2013-05-21 19:28     ` Dave Hansen
2013-05-22 13:51     ` Kirill A. Shutemov
2013-05-22 13:51       ` Kirill A. Shutemov
2013-05-22 15:31       ` Dave Hansen
2013-05-22 15:31         ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 10/39] thp: account anon transparent huge pages into NR_ANON_PAGES Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 19:32   ` Dave Hansen
2013-05-21 19:32     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 11/39] thp: represent file thp pages in meminfo and friends Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 19:34   ` Dave Hansen
2013-05-21 19:34     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 12/39] thp, mm: rewrite add_to_page_cache_locked() to support huge pages Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 19:59   ` Dave Hansen
2013-05-21 19:59     ` Dave Hansen
2013-05-23 14:36     ` Kirill A. Shutemov
2013-05-23 14:36       ` Kirill A. Shutemov
2013-05-23 16:00       ` Dave Hansen
2013-05-23 16:00         ` Dave Hansen
2013-05-28 11:59         ` Kirill A. Shutemov
2013-05-28 11:59           ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 13/39] mm: trace filemap: dump page order Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 19:35   ` Dave Hansen
2013-05-21 19:35     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 14/39] thp, mm: rewrite delete_from_page_cache() to support huge pages Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 20:14   ` Dave Hansen
2013-05-21 20:14     ` Dave Hansen
2013-05-28 12:28     ` Kirill A. Shutemov
2013-05-28 12:28       ` Kirill A. Shutemov
2013-06-07 15:10       ` Kirill A. Shutemov
2013-06-07 15:10         ` Kirill A. Shutemov
2013-06-07 15:10         ` Kirill A. Shutemov
2013-06-07 15:56         ` Dave Hansen
2013-06-07 15:56           ` Dave Hansen
2013-06-10 17:41           ` Kirill A. Shutemov
2013-06-10 17:41             ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 15/39] thp, mm: trigger bug in replace_page_cache_page() on THP Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 20:17   ` Dave Hansen [this message]
2013-05-21 20:17     ` Dave Hansen
2013-05-28 12:53     ` Kirill A. Shutemov
2013-05-28 12:53       ` Kirill A. Shutemov
2013-05-28 16:33       ` Dave Hansen
2013-05-28 16:33         ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 16/39] thp, mm: locking tail page is a bug Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 20:18   ` Dave Hansen
2013-05-21 20:18     ` Dave Hansen
2013-05-22 14:12     ` Kirill A. Shutemov
2013-05-22 14:12       ` Kirill A. Shutemov
2013-05-22 14:53       ` Dave Hansen
2013-05-22 14:53         ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 17/39] thp, mm: handle tail pages in page_cache_get_speculative() Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 20:49   ` Dave Hansen
2013-05-21 20:49     ` Dave Hansen
2013-06-27 12:40     ` Kirill A. Shutemov
2013-06-27 12:40       ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 18/39] thp, mm: add event counters for huge page alloc on write to a file Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 20:54   ` Dave Hansen
2013-05-21 20:54     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 19/39] thp, mm: allocate huge pages in grab_cache_page_write_begin() Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 21:14   ` Dave Hansen
2013-05-21 21:14     ` Dave Hansen
2013-05-30 13:20     ` Kirill A. Shutemov
2013-05-30 13:20       ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 20/39] thp, mm: naive support of thp in generic read/write routines Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 21:28   ` Dave Hansen
2013-05-21 21:28     ` Dave Hansen
2013-06-07 15:17     ` Kirill A. Shutemov
2013-06-07 15:17       ` Kirill A. Shutemov
2013-06-07 15:29       ` Dave Hansen
2013-06-07 15:29         ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 21/39] thp, libfs: initial support of thp in simple_read/write_begin/write_end Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 21:49   ` Dave Hansen
2013-05-21 21:49     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 22/39] thp: handle file pages in split_huge_page() Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 23/39] thp: wait_split_huge_page(): serialize over i_mmap_mutex too Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 22:05   ` Dave Hansen
2013-05-21 22:05     ` Dave Hansen
2013-06-03 15:02     ` Kirill A. Shutemov
2013-06-03 15:02       ` Kirill A. Shutemov
2013-06-03 15:53       ` Dave Hansen
2013-06-03 15:53         ` Dave Hansen
2013-06-03 16:09         ` Kirill A. Shutemov
2013-06-03 16:09           ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 24/39] thp, mm: truncate support for transparent huge page cache Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 22:39   ` Dave Hansen
2013-05-21 22:39     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 25/39] thp, mm: split huge page on mmap file page Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 26/39] ramfs: enable transparent huge page cache Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 22:43   ` Dave Hansen
2013-05-21 22:43     ` Dave Hansen
2013-05-22 14:22     ` Kirill A. Shutemov
2013-05-22 14:22       ` Kirill A. Shutemov
2013-05-22 14:55       ` Dave Hansen
2013-05-22 14:55         ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 27/39] x86-64, mm: proper alignment mappings with hugepages Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 22:56   ` Dave Hansen
2013-05-21 22:56     ` Dave Hansen
2013-06-25 14:56     ` Kirill A. Shutemov
2013-06-25 14:56       ` Kirill A. Shutemov
2013-06-25 16:46       ` Dave Hansen
2013-06-25 16:46         ` Dave Hansen
2013-05-21 23:20   ` Dave Hansen
2013-05-21 23:20     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 28/39] thp: prepare zap_huge_pmd() to uncharge file pages Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-22  7:26   ` Hillf Danton
2013-05-22  7:26     ` Hillf Danton
2013-05-12  1:23 ` [PATCHv4 29/39] thp: move maybe_pmd_mkwrite() out of mk_huge_pmd() Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 23:23   ` Dave Hansen
2013-05-21 23:23     ` Dave Hansen
2013-05-22 14:37     ` Kirill A. Shutemov
2013-05-22 14:37       ` Kirill A. Shutemov
2013-05-22 14:56       ` Dave Hansen
2013-05-22 14:56         ` Dave Hansen
2013-05-21 23:23   ` Dave Hansen
2013-05-21 23:23     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 30/39] thp: do_huge_pmd_anonymous_page() cleanup Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-22 11:45   ` Hillf Danton
2013-05-22 11:45     ` Hillf Danton
2013-05-12  1:23 ` [PATCHv4 31/39] thp: consolidate code between handle_mm_fault() and do_huge_pmd_anonymous_page() Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 23:38   ` Dave Hansen
2013-05-21 23:38     ` Dave Hansen
2013-05-22  6:51   ` Hillf Danton
2013-05-22  6:51     ` Hillf Danton
2013-05-12  1:23 ` [PATCHv4 32/39] mm: cleanup __do_fault() implementation Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-21 23:57   ` Dave Hansen
2013-05-21 23:57     ` Dave Hansen
2013-05-12  1:23 ` [PATCHv4 33/39] thp, mm: implement do_huge_linear_fault() Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-22 12:47   ` Hillf Danton
2013-05-22 12:47     ` Hillf Danton
2013-05-22 15:13     ` Kirill A. Shutemov
2013-05-22 15:13       ` Kirill A. Shutemov
2013-05-22 12:56   ` Hillf Danton
2013-05-22 12:56     ` Hillf Danton
2013-05-22 15:14     ` Kirill A. Shutemov
2013-05-22 15:14       ` Kirill A. Shutemov
2013-05-22 13:24   ` Hillf Danton
2013-05-22 13:24     ` Hillf Danton
2013-05-22 15:26     ` Kirill A. Shutemov
2013-05-22 15:26       ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 34/39] thp, mm: handle huge pages in filemap_fault() Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-22 11:37   ` Hillf Danton
2013-05-22 11:37     ` Hillf Danton
2013-05-22 15:34     ` Kirill A. Shutemov
2013-05-22 15:34       ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 35/39] mm: decomposite do_wp_page() and get rid of some 'goto' logic Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 36/39] mm: do_wp_page(): extract VM_WRITE|VM_SHARED case to separate function Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 37/39] thp: handle write-protect exception to file-backed huge pages Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-23 11:57   ` Hillf Danton
2013-05-23 11:57     ` Hillf Danton
2013-05-23 12:08     ` Kirill A. Shutemov
2013-05-23 12:08       ` Kirill A. Shutemov
2013-05-23 12:12       ` Hillf Danton
2013-05-23 12:12         ` Hillf Danton
2013-05-23 12:33         ` Kirill A. Shutemov
2013-05-23 12:33           ` Kirill A. Shutemov
2013-05-12  1:23 ` [PATCHv4 38/39] thp: vma_adjust_trans_huge(): adjust file-backed VMA too Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-23 11:01   ` Hillf Danton
2013-05-23 11:01     ` Hillf Danton
2013-05-12  1:23 ` [PATCHv4 39/39] thp: map file-backed huge pages on fault Kirill A. Shutemov
2013-05-12  1:23   ` Kirill A. Shutemov
2013-05-23 11:36   ` Hillf Danton
2013-05-23 11:36     ` Hillf Danton
2013-05-23 11:48     ` Kirill A. Shutemov
2013-05-23 11:48       ` Kirill A. Shutemov
2013-05-21 18:37 ` [PATCHv4 00/39] Transparent huge page cache Dave Hansen
2013-05-21 18:37   ` Dave Hansen

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=519BD65C.1050709@sr71.net \
    --to=dave@sr71.net \
    --cc=aarcange@redhat.com \
    --cc=ak@linux.intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=dhillf@gmail.com \
    --cc=fengguang.wu@intel.com \
    --cc=hughd@google.com \
    --cc=jack@suse.cz \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kirill@shutemov.name \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=matthew.r.wilcox@intel.com \
    --cc=mgorman@suse.de \
    --cc=viro@zeniv.linux.org.uk \
    /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.