linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@infradead.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Paul Mackerras <paulus@samba.org>,
	Michael Ellerman <mpe@ellerman.id.au>,
	linux-arch@vger.kernel.org, linux-mm@kvack.org,
	iommu@lists.linux-foundation.org, linuxppc-dev@lists.ozlabs.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 06/34] powerpc/dma: split the two __dma_alloc_coherent implementations
Date: Thu, 6 Dec 2018 06:10:22 -0800	[thread overview]
Message-ID: <20181206141022.GG29741@infradead.org> (raw)
In-Reply-To: <20181114082314.8965-7-hch@lst.de>

ping?

On Wed, Nov 14, 2018 at 09:22:46AM +0100, Christoph Hellwig wrote:
> The implemementation for the CONFIG_NOT_COHERENT_CACHE case doesn't share
> any code with the one for systems with coherent caches.  Split it off
> and merge it with the helpers in dma-noncoherent.c that have no other
> callers.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> ---
>  arch/powerpc/include/asm/dma-mapping.h |  5 -----
>  arch/powerpc/kernel/dma.c              | 14 ++------------
>  arch/powerpc/mm/dma-noncoherent.c      | 15 +++++++--------
>  arch/powerpc/platforms/44x/warp.c      |  2 +-
>  4 files changed, 10 insertions(+), 26 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h
> index f2a4a7142b1e..dacd0f93f2b2 100644
> --- a/arch/powerpc/include/asm/dma-mapping.h
> +++ b/arch/powerpc/include/asm/dma-mapping.h
> @@ -39,9 +39,6 @@ extern int dma_nommu_mmap_coherent(struct device *dev,
>   * to ensure it is consistent.
>   */
>  struct device;
> -extern void *__dma_alloc_coherent(struct device *dev, size_t size,
> -				  dma_addr_t *handle, gfp_t gfp);
> -extern void __dma_free_coherent(size_t size, void *vaddr);
>  extern void __dma_sync(void *vaddr, size_t size, int direction);
>  extern void __dma_sync_page(struct page *page, unsigned long offset,
>  				 size_t size, int direction);
> @@ -52,8 +49,6 @@ extern unsigned long __dma_get_coherent_pfn(unsigned long cpu_addr);
>   * Cache coherent cores.
>   */
>  
> -#define __dma_alloc_coherent(dev, gfp, size, handle)	NULL
> -#define __dma_free_coherent(size, addr)		((void)0)
>  #define __dma_sync(addr, size, rw)		((void)0)
>  #define __dma_sync_page(pg, off, sz, rw)	((void)0)
>  
> diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c
> index 6551685a4ed0..d6deb458bb91 100644
> --- a/arch/powerpc/kernel/dma.c
> +++ b/arch/powerpc/kernel/dma.c
> @@ -62,18 +62,12 @@ static int dma_nommu_dma_supported(struct device *dev, u64 mask)
>  #endif
>  }
>  
> +#ifndef CONFIG_NOT_COHERENT_CACHE
>  void *__dma_nommu_alloc_coherent(struct device *dev, size_t size,
>  				  dma_addr_t *dma_handle, gfp_t flag,
>  				  unsigned long attrs)
>  {
>  	void *ret;
> -#ifdef CONFIG_NOT_COHERENT_CACHE
> -	ret = __dma_alloc_coherent(dev, size, dma_handle, flag);
> -	if (ret == NULL)
> -		return NULL;
> -	*dma_handle += get_dma_offset(dev);
> -	return ret;
> -#else
>  	struct page *page;
>  	int node = dev_to_node(dev);
>  #ifdef CONFIG_FSL_SOC
> @@ -110,19 +104,15 @@ void *__dma_nommu_alloc_coherent(struct device *dev, size_t size,
>  	*dma_handle = __pa(ret) + get_dma_offset(dev);
>  
>  	return ret;
> -#endif
>  }
>  
>  void __dma_nommu_free_coherent(struct device *dev, size_t size,
>  				void *vaddr, dma_addr_t dma_handle,
>  				unsigned long attrs)
>  {
> -#ifdef CONFIG_NOT_COHERENT_CACHE
> -	__dma_free_coherent(size, vaddr);
> -#else
>  	free_pages((unsigned long)vaddr, get_order(size));
> -#endif
>  }
> +#endif /* !CONFIG_NOT_COHERENT_CACHE */
>  
>  static void *dma_nommu_alloc_coherent(struct device *dev, size_t size,
>  				       dma_addr_t *dma_handle, gfp_t flag,
> diff --git a/arch/powerpc/mm/dma-noncoherent.c b/arch/powerpc/mm/dma-noncoherent.c
> index b6e7b5952ab5..e955539686a4 100644
> --- a/arch/powerpc/mm/dma-noncoherent.c
> +++ b/arch/powerpc/mm/dma-noncoherent.c
> @@ -29,7 +29,7 @@
>  #include <linux/string.h>
>  #include <linux/types.h>
>  #include <linux/highmem.h>
> -#include <linux/dma-mapping.h>
> +#include <linux/dma-direct.h>
>  #include <linux/export.h>
>  
>  #include <asm/tlbflush.h>
> @@ -151,8 +151,8 @@ static struct ppc_vm_region *ppc_vm_region_find(struct ppc_vm_region *head, unsi
>   * Allocate DMA-coherent memory space and return both the kernel remapped
>   * virtual and bus address for that space.
>   */
> -void *
> -__dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp)
> +void *__dma_nommu_alloc_coherent(struct device *dev, size_t size,
> +		dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs)
>  {
>  	struct page *page;
>  	struct ppc_vm_region *c;
> @@ -223,7 +223,7 @@ __dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t
>  		/*
>  		 * Set the "dma handle"
>  		 */
> -		*handle = page_to_phys(page);
> +		*dma_handle = phys_to_dma(dev, page_to_phys(page));
>  
>  		do {
>  			SetPageReserved(page);
> @@ -249,12 +249,12 @@ __dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t
>   no_page:
>  	return NULL;
>  }
> -EXPORT_SYMBOL(__dma_alloc_coherent);
>  
>  /*
>   * free a page as defined by the above mapping.
>   */
> -void __dma_free_coherent(size_t size, void *vaddr)
> +void __dma_nommu_free_coherent(struct device *dev, size_t size, void *vaddr,
> +		dma_addr_t dma_handle, unsigned long attrs)
>  {
>  	struct ppc_vm_region *c;
>  	unsigned long flags, addr;
> @@ -309,7 +309,6 @@ void __dma_free_coherent(size_t size, void *vaddr)
>  	       __func__, vaddr);
>  	dump_stack();
>  }
> -EXPORT_SYMBOL(__dma_free_coherent);
>  
>  /*
>   * make an area consistent.
> @@ -401,7 +400,7 @@ EXPORT_SYMBOL(__dma_sync_page);
>  
>  /*
>   * Return the PFN for a given cpu virtual address returned by
> - * __dma_alloc_coherent. This is used by dma_mmap_coherent()
> + * __dma_nommu_alloc_coherent. This is used by dma_mmap_coherent()
>   */
>  unsigned long __dma_get_coherent_pfn(unsigned long cpu_addr)
>  {
> diff --git a/arch/powerpc/platforms/44x/warp.c b/arch/powerpc/platforms/44x/warp.c
> index a886c2c22097..7e4f8ca19ce8 100644
> --- a/arch/powerpc/platforms/44x/warp.c
> +++ b/arch/powerpc/platforms/44x/warp.c
> @@ -47,7 +47,7 @@ static int __init warp_probe(void)
>  	if (!of_machine_is_compatible("pika,warp"))
>  		return 0;
>  
> -	/* For __dma_alloc_coherent */
> +	/* For __dma_nommu_alloc_coherent */
>  	ISA_DMA_THRESHOLD = ~0L;
>  
>  	return 1;
> -- 
> 2.19.1
> 
> _______________________________________________
> iommu mailing list
> iommu@lists.linux-foundation.org
> https://lists.linuxfoundation.org/mailman/listinfo/iommu
---end quoted text---

  reply	other threads:[~2018-12-06 14:10 UTC|newest]

Thread overview: 178+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-14  8:22 use generic DMA mapping code in powerpc V4 Christoph Hellwig
2018-11-14  8:22 ` [PATCH 01/34] powerpc: use mm zones more sensibly Christoph Hellwig
2018-12-06 14:09   ` Christoph Hellwig
2018-12-07 12:18     ` Michael Ellerman
2018-12-07 14:09       ` Christoph Hellwig
2018-12-07 15:04         ` Christian Zigotzky
2018-11-14  8:22 ` [PATCH 02/34] powerpc: allow NOT_COHERENT_CACHE for amigaone Christoph Hellwig
2018-12-06 14:09   ` Christoph Hellwig
2018-11-14  8:22 ` [PATCH 03/34] powerpc/dma: remove the unused ARCH_HAS_DMA_MMAP_COHERENT define Christoph Hellwig
2018-12-06 14:09   ` Christoph Hellwig
2018-11-14  8:22 ` [PATCH 04/34] powerpc/dma: remove the unused ISA_DMA_THRESHOLD export Christoph Hellwig
2018-12-06 14:10   ` Christoph Hellwig
2018-11-14  8:22 ` [PATCH 05/34] powerpc/dma: remove the unused dma_iommu_ops export Christoph Hellwig
2018-12-06 14:10   ` Christoph Hellwig
2018-11-14  8:22 ` [PATCH 06/34] powerpc/dma: split the two __dma_alloc_coherent implementations Christoph Hellwig
2018-12-06 14:10   ` Christoph Hellwig [this message]
2018-11-14  8:22 ` [PATCH 07/34] powerpc/dma: remove the no-op dma_nommu_unmap_{page,sg} routines Christoph Hellwig
2018-12-06 14:10   ` [PATCH 07/34] powerpc/dma: remove the no-op dma_nommu_unmap_{page, sg} routines Christoph Hellwig
2018-11-14  8:22 ` [PATCH 08/34] powerpc/dma: untangle vio_dma_mapping_ops from dma_iommu_ops Christoph Hellwig
2018-12-06 14:10   ` Christoph Hellwig
2018-11-14  8:22 ` [PATCH 09/34] powerpc/dma: handle iommu bypass in dma_iommu_ops Christoph Hellwig
2018-11-14  8:22 ` [PATCH 10/34] powerpc/pseries: unwind dma_get_required_mask_pSeriesLP a bit Christoph Hellwig
2018-11-14  8:22 ` [PATCH 11/34] powerpc/pseries: use the generic iommu bypass code Christoph Hellwig
2018-11-14  8:22 ` [PATCH 12/34] powerpc/cell: move dma direct window setup out of dma_configure Christoph Hellwig
2018-12-09 10:23   ` Michael Ellerman
2018-12-12 14:36     ` Christoph Hellwig
2018-12-14 13:29       ` Michael Ellerman
2018-12-14 16:42         ` Christoph Hellwig
2018-11-14  8:22 ` [PATCH 13/34] powerpc/cell: use the generic iommu bypass code Christoph Hellwig
2018-11-14  8:22 ` [PATCH 14/34] powerpc/dart: remove dead cleanup code in iommu_init_early_dart Christoph Hellwig
2018-12-06 14:11   ` Christoph Hellwig
2018-11-14  8:22 ` [PATCH 15/34] powerpc/dart: use the generic iommu bypass code Christoph Hellwig
2018-11-14  8:22 ` [PATCH 16/34] powerpc/powernv: remove pnv_pci_ioda_pe_single_vendor Christoph Hellwig
2018-11-14  8:22 ` [PATCH 17/34] powerpc/powernv: remove pnv_npu_dma_set_mask Christoph Hellwig
2018-11-14  8:22 ` [PATCH 18/34] powerpc/powernv: use the generic iommu bypass code Christoph Hellwig
2018-11-14  8:22 ` [PATCH 19/34] cxl: drop the dma_set_mask callback from vphb Christoph Hellwig
2018-12-06 14:10   ` Christoph Hellwig
2018-11-14  8:23 ` [PATCH 20/34] powerpc/dma: stop overriding dma_get_required_mask Christoph Hellwig
2018-11-14  8:23 ` [PATCH 21/34] powerpc/pci: remove the dma_set_mask pci_controller ops methods Christoph Hellwig
2018-11-14  8:23 ` [PATCH 22/34] powerpc/dma: remove the iommu fallback for coherent allocations Christoph Hellwig
2018-11-14  8:23 ` [PATCH 23/34] powerpc/dma: remove get_pci_dma_ops Christoph Hellwig
2018-11-14  8:23 ` [PATCH 24/34] powerpc/dma: move pci_dma_dev_setup_swiotlb to fsl_pci.c Christoph Hellwig
2018-11-14  8:23 ` [PATCH 25/34] powerpc/dma: remove max_direct_dma_addr Christoph Hellwig
2018-11-14  8:23 ` [PATCH 26/34] powerpc/dma: fix an off-by-one in dma_capable Christoph Hellwig
2018-11-14  8:23 ` [PATCH 27/34] powerpc/fsl_pci: simplify fsl_pci_dma_set_mask Christoph Hellwig
2018-11-14  8:23 ` [PATCH 28/34] dma-mapping, powerpc: simplify the arch dma_set_mask override Christoph Hellwig
2018-11-14  8:23 ` [PATCH 29/34] powerpc/dma: use phys_to_dma instead of get_dma_offset Christoph Hellwig
2018-11-14  8:23 ` [PATCH 30/34] powerpc/dma: remove dma_nommu_mmap_coherent Christoph Hellwig
2018-11-14  8:23 ` [PATCH 31/34] powerpc/dma: use generic direct and swiotlb ops Christoph Hellwig
2018-11-14  8:23 ` [PATCH 32/34] powerpc/dma: remove get_dma_offset Christoph Hellwig
2018-11-14  8:23 ` [PATCH 33/34] powerpc/dma: remove set_dma_offset Christoph Hellwig
2018-11-14  8:23 ` [PATCH 34/34] powerpc/dma: trim the fat from <asm/dma-mapping.h> Christoph Hellwig
2018-11-27  7:42 ` use generic DMA mapping code in powerpc V4 Christoph Hellwig
2018-11-27 22:05   ` Benjamin Herrenschmidt
2018-11-28 11:05   ` Michael Ellerman
2018-11-28 15:55     ` Christian Zigotzky
2018-11-28 20:02       ` Christian Zigotzky
2018-11-28 20:35       ` Michal Suchánek
2018-11-29 17:03         ` Christoph Hellwig
2019-12-19 13:54       ` Christian Zigotzky
2018-11-29 12:05     ` Christian Zigotzky
2018-11-29 15:30       ` Christian Zigotzky
2018-11-29 17:03       ` Christoph Hellwig
2018-11-29 23:07         ` Christian Zigotzky
2018-11-30 10:53           ` Christoph Hellwig
2018-11-30 12:23             ` Christian Zigotzky
2018-11-30 13:10               ` Christoph Hellwig
2018-11-30 15:29                 ` Christian Zigotzky
2018-12-04  7:31                   ` Christian Zigotzky
2018-12-04  9:53                     ` Christian Zigotzky
2018-12-04 14:24                       ` Christoph Hellwig
2018-12-05  9:44                         ` Christian Zigotzky
2018-12-05 14:05                           ` Christoph Hellwig
2018-12-06 10:55                             ` Christian Zigotzky
2018-12-06 17:10                               ` Christian Zigotzky
2018-12-06 19:36                                 ` Christoph Hellwig
2018-12-07  7:48                                   ` Christian Zigotzky
2018-12-07 13:45                               ` Christian Zigotzky
2018-12-07 18:33                                 ` Christian Zigotzky
2018-12-08 10:29                                   ` Christian Zigotzky
2018-12-08 13:47                                     ` Christian Zigotzky
2018-12-09 14:20                                       ` Christian Zigotzky
2018-12-09 18:26                                         ` Christian Zigotzky
2018-12-10 15:54                                           ` Christian Zigotzky
2018-12-11 14:28                                             ` Christian Zigotzky
2018-12-11 18:17                                               ` Christian Zigotzky
2018-12-12  0:47                                                 ` Benjamin Herrenschmidt
2018-12-12  7:03                                                   ` Christian Zigotzky
2018-12-12 14:15                                                 ` Christoph Hellwig
2018-12-12 14:39                                                   ` Christian Zigotzky
2018-12-13  8:41                                                     ` Christian Zigotzky
2018-12-13  9:10                                                       ` Christoph Hellwig
2018-12-13  9:47                                                         ` Christian Zigotzky
2018-12-13 11:19                                                           ` Christian Zigotzky
2018-12-13 11:25                                                             ` Christoph Hellwig
2018-12-13 13:34                                                               ` Christian Zigotzky
2018-12-13 17:48                                                                 ` Christian Zigotzky
2018-12-13 21:53                                                                   ` Christian Zigotzky
2018-12-14 12:00                                                                     ` Christian Zigotzky
2018-12-14 16:45                                                                       ` Christoph Hellwig
2019-01-03  7:36                                                                       ` Christoph Hellwig
2019-01-03 19:26                                                                         ` Christian Zigotzky
2019-01-05 16:03                                                                           ` Christian Zigotzky
2019-01-09  9:31                                                                             ` Christian Zigotzky
2019-01-11  2:10                                                                               ` Christian Zigotzky
2019-01-12 18:14                                                                                 ` Christian Zigotzky
2019-01-15  8:07                                                                                   ` Christian Zigotzky
2019-01-15  8:49                                                                                     ` Christian Zigotzky
2019-01-15 10:55                                                                                       ` Christian Zigotzky
2019-01-15 13:35                                                                                         ` Christoph Hellwig
2019-01-15 13:56                                                                                           ` Christian Zigotzky
2019-01-15 15:17                                                                                             ` Christoph Hellwig
2019-01-17  9:21                                                                                               ` Christian Zigotzky
2019-01-17  9:31                                                                                                 ` Christoph Hellwig
2019-01-17  9:44                                                                                                   ` Christian Zigotzky
2019-01-18  8:35                                                                                                 ` Christoph Hellwig
2019-01-18 11:10                                                                                                   ` Christian Zigotzky
2019-01-18 11:28                                                                                                     ` Christoph Hellwig
2019-01-18 12:07                                                                                                       ` Christian Zigotzky
2019-01-18 12:18                                                                                                         ` Christoph Hellwig
2019-01-18 12:46                                                                                                           ` Christian Zigotzky
2019-01-18 12:55                                                                                                             ` Christoph Hellwig
2019-01-18 15:06                                                                                                               ` Christian Zigotzky
2019-01-19 11:40                                                                                                                 ` Christian Zigotzky
2019-01-19 11:52                                                                                                                   ` Christian Zigotzky
2019-01-19 13:02                                                                                                                     ` Christoph Hellwig
2019-01-19 14:04                                                                                                                       ` Christoph Hellwig
2019-01-21 14:38                                                                                                                         ` Christian Zigotzky
2019-01-23 14:34                                                                                                                           ` Christian Zigotzky
2019-01-25 13:37                                                                                                                             ` Christian Zigotzky
2019-01-27 13:13                                                                                                                               ` Christian Zigotzky
2019-01-28  7:04                                                                                                                                 ` Christoph Hellwig
2019-01-28 16:22                                                                                                                                   ` Christoph Hellwig
2019-01-28 16:52                                                                                                                                     ` Christian Zigotzky
2019-01-29 15:03                                                                                                                                       ` Christian Zigotzky
2019-01-29 16:14                                                                                                                                         ` Christoph Hellwig
2019-01-29 16:34                                                                                                                                           ` Christoph Hellwig
2019-01-30  4:40                                                                                                                                             ` Christian Zigotzky
2019-01-31 12:48                                                                                                                                               ` Christian Zigotzky
2019-02-01  8:04                                                                                                                                                 ` Christoph Hellwig
2019-02-01 16:54                                                                                                                                                   ` Christian Zigotzky
2019-02-03 16:49                                                                                                                                                     ` Christian Zigotzky
2019-02-04  7:56                                                                                                                                                       ` Christoph Hellwig
2019-02-04 12:13                                                                                                                                                         ` Christian Zigotzky
2019-02-04 12:38                                                                                                                                                           ` Christoph Hellwig
2019-02-06 13:45                                                                                                                                                             ` Christian Zigotzky
2019-02-06 15:15                                                                                                                                                               ` Christoph Hellwig
2019-02-06 15:16                                                                                                                                                                 ` Christoph Hellwig
2019-02-07  4:34                                                                                                                                                                   ` Christian Zigotzky
2019-02-08  9:01                                                                                                                                                                     ` Christian Zigotzky
2019-02-08  9:18                                                                                                                                                                       ` Christoph Hellwig
2019-02-08 10:59                                                                                                                                                                         ` Christian Zigotzky
2019-02-10 12:00                                                                                                                                                                         ` Christian Zigotzky
     [not found]                                                                                                                                                                           ` <0042290A-2939-4EBA-A638-D404FA2055ED@xenosoft.de>
2019-02-11  7:21                                                                                                                                                                             ` Christian Zigotzky
2019-02-11  7:38                                                                                                                                                                           ` Christoph Hellwig
2019-02-12 12:42                                                                                                                                                                             ` Christian Zigotzky
2019-02-12 15:25                                                                                                                                                                               ` Christoph Hellwig
2019-02-12 19:31                                                                                                                                                                                 ` Christian Zigotzky
2019-02-12 19:50                                                                                                                                                                                   ` Christian Zigotzky
2019-02-12 19:52                                                                                                                                                                                     ` Christoph Hellwig
2019-11-05  7:56                                                                               ` Bug 205201 - overflow of DMA mask and bus mask Christian Zigotzky
2019-11-05 16:28                                                                                 ` Christoph Hellwig
2019-11-06 14:09                                                                                   ` Robin Murphy
2019-11-21 17:26                                                                                     ` Christoph Hellwig
2019-11-07  9:53                                                                                   ` Christian Zigotzky
2019-11-10  7:27                                                                                     ` Christian Zigotzky
2019-11-11  8:12                                                                                       ` Christian Zigotzky
2019-11-11  8:16                                                                                         ` Christian Zigotzky
2019-11-11 12:22                                                                                           ` Christian Zigotzky
2019-11-12 14:41                                                                                             ` Christoph Hellwig
2019-11-12 22:58                                                                                               ` Christian Zigotzky
2019-11-13 10:14                                                                                               ` Christian Zigotzky
2019-11-13 11:02                                                                                                 ` Christoph Hellwig
2018-11-29 17:02     ` use generic DMA mapping code in powerpc V4 Christoph Hellwig
2018-11-30  3:17   ` Benjamin Herrenschmidt
2018-12-08 17:03 ` Christoph Hellwig
2018-12-16 16:51 ` Christoph Hellwig
2018-12-17  1:14   ` Michael Ellerman

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=20181206141022.GG29741@infradead.org \
    --to=hch@infradead.org \
    --cc=benh@kernel.crashing.org \
    --cc=hch@lst.de \
    --cc=iommu@lists.linux-foundation.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mpe@ellerman.id.au \
    --cc=paulus@samba.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).