All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Hubbard <jhubbard@nvidia.com>
To: Logan Gunthorpe <logang@deltatee.com>,
	<linux-kernel@vger.kernel.org>, <linux-nvme@lists.infradead.org>,
	<linux-block@vger.kernel.org>, <linux-pci@vger.kernel.org>,
	<linux-mm@kvack.org>, <iommu@lists.linux-foundation.org>
Cc: "Stephen Bates" <sbates@raithlin.com>,
	"Christoph Hellwig" <hch@lst.de>,
	"Dan Williams" <dan.j.williams@intel.com>,
	"Jason Gunthorpe" <jgg@ziepe.ca>,
	"Christian König" <christian.koenig@amd.com>,
	"Don Dutile" <ddutile@redhat.com>,
	"Matthew Wilcox" <willy@infradead.org>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Jakowski Andrzej" <andrzej.jakowski@intel.com>,
	"Minturn Dave B" <dave.b.minturn@intel.com>,
	"Jason Ekstrand" <jason@jlekstrand.net>,
	"Dave Hansen" <dave.hansen@linux.intel.com>,
	"Xiong Jianxin" <jianxin.xiong@intel.com>,
	"Bjorn Helgaas" <helgaas@kernel.org>,
	"Ira Weiny" <ira.weiny@intel.com>,
	"Robin Murphy" <robin.murphy@arm.com>
Subject: Re: [PATCH 08/16] PCI/P2PDMA: Introduce helpers for dma_map_sg implementations
Date: Sun, 2 May 2021 17:50:39 -0700	[thread overview]
Message-ID: <e27d35f8-5c3a-39e3-9845-6d2bf15cc8b3@nvidia.com> (raw)
In-Reply-To: <20210408170123.8788-9-logang@deltatee.com>

On 4/8/21 10:01 AM, Logan Gunthorpe wrote:
> Add pci_p2pdma_map_segment() as a helper for simple dma_map_sg()
> implementations. It takes an scatterlist segment that must point to a
> pci_p2pdma struct page and will map it if the mapping requires a bus
> address.
> 
> The return value indicates whether the mapping required a bus address
> or whether the caller still needs to map the segment normally. If the
> segment should not be mapped, -EREMOTEIO is returned.
> 
> This helper uses a state structure to track the changes to the
> pgmap across calls and avoid needing to lookup into the xarray for
> every page.
> 

OK, coming back to this patch, after seeing how it is used later in
the series...

> Also add pci_p2pdma_map_bus_segment() which is useful for IOMMU
> dma_map_sg() implementations where the sg segment containing the page
> differs from the sg segment containing the DMA address.
> 
> Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
> ---
>   drivers/pci/p2pdma.c       | 65 ++++++++++++++++++++++++++++++++++++++
>   include/linux/pci-p2pdma.h | 21 ++++++++++++
>   2 files changed, 86 insertions(+)
> 
> diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
> index 38c93f57a941..44ad7664e875 100644
> --- a/drivers/pci/p2pdma.c
> +++ b/drivers/pci/p2pdma.c
> @@ -923,6 +923,71 @@ void pci_p2pdma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
>   }
>   EXPORT_SYMBOL_GPL(pci_p2pdma_unmap_sg_attrs);
>   
> +/**
> + * pci_p2pdma_map_segment - map an sg segment determining the mapping type
> + * @state: State structure that should be declared on the stack outside of
> + *	the for_each_sg() loop and initialized to zero.

Silly fine point for the docs here: it doesn't actually have to be on
the stack, so I don't think you need to write that constraint in the
documentation. It just has be be somehow allocated and zeroed.


> + * @dev: DMA device that's doing the mapping operation
> + * @sg: scatterlist segment to map
> + * @attrs: dma mapping attributes
> + *
> + * This is a helper to be used by non-iommu dma_map_sg() implementations where
> + * the sg segment is the same for the page_link and the dma_address.
> + *
> + * Attempt to map a single segment in an SGL with the PCI bus address.
> + * The segment must point to a PCI P2PDMA page and thus must be
> + * wrapped in a is_pci_p2pdma_page(sg_page(sg)) check.

Should this be backed up with actual checks in the function, that
the prerequisites are met?

> + *
> + * Returns 1 if the segment was mapped, 0 if the segment should be mapped
> + * directly (or through the IOMMU) and -EREMOTEIO if the segment should not
> + * be mapped at all.
> + */
> +int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +			   struct device *dev, struct scatterlist *sg,
> +			   unsigned long dma_attrs)
> +{
> +	if (state->pgmap != sg_page(sg)->pgmap) {
> +		state->pgmap = sg_page(sg)->pgmap;
> +		state->map = pci_p2pdma_map_type(state->pgmap, dev, dma_attrs);
> +		state->bus_off = to_p2p_pgmap(state->pgmap)->bus_offset;
> +	}

I'll quote myself from patch 9, because I had a comment there that actually
was meant for this patch:

Is it worth putting this stuff on the caller's stack? I mean, is there a
noticeable performance improvement from caching the state? Because if
it's invisible, then simplicity is better. I suspect you're right, and
that it *is* worth it, but it's good to know for real.


> +
> +	switch (state->map) {
> +	case PCI_P2PDMA_MAP_BUS_ADDR:
> +		sg->dma_address = sg_phys(sg) + state->bus_off;
> +		sg_dma_len(sg) = sg->length;
> +		sg_mark_pci_p2pdma(sg);
> +		return 1;
> +	case PCI_P2PDMA_MAP_THRU_HOST_BRIDGE:
> +		return 0;
> +	default:
> +		return -EREMOTEIO;
> +	}
> +}
> +
> +/**
> + * pci_p2pdma_map_bus_segment - map an sg segment pre determined to
> + *	be mapped with PCI_P2PDMA_MAP_BUS_ADDR

Or:

  * pci_p2pdma_map_bus_segment - map an SG segment that is already known
  * to be mapped with PCI_P2PDMA_MAP_BUS_ADDR

Also, should that prerequisite be backed up with checks in the function?

> + * @pg_sg: scatterlist segment with the page to map
> + * @dma_sg: scatterlist segment to assign a dma address to
> + *
> + * This is a helper for iommu dma_map_sg() implementations when the
> + * segment for the dma address differs from the segment containing the
> + * source page.
> + *
> + * pci_p2pdma_map_type() must have already been called on the pg_sg and
> + * returned PCI_P2PDMA_MAP_BUS_ADDR.

Another prerequisite, so same question: do you think that the code should
also check that this prerequisite is met?

thanks,
-- 
John Hubbard
NVIDIA

> + */
> +void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +				struct scatterlist *dma_sg)
> +{
> +	struct pci_p2pdma_pagemap *pgmap = to_p2p_pgmap(sg_page(pg_sg)->pgmap);
> +
> +	dma_sg->dma_address = sg_phys(pg_sg) + pgmap->bus_offset;
> +	sg_dma_len(dma_sg) = pg_sg->length;
> +	sg_mark_pci_p2pdma(dma_sg);
> +}
> +
>   /**
>    * pci_p2pdma_enable_store - parse a configfs/sysfs attribute store
>    *		to enable p2pdma
> diff --git a/include/linux/pci-p2pdma.h b/include/linux/pci-p2pdma.h
> index a06072ac3a52..49e7679403cf 100644
> --- a/include/linux/pci-p2pdma.h
> +++ b/include/linux/pci-p2pdma.h
> @@ -13,6 +13,12 @@
>   
>   #include <linux/pci.h>
>   
> +struct pci_p2pdma_map_state {
> +	struct dev_pagemap *pgmap;
> +	int map;
> +	u64 bus_off;
> +};
> +
>   struct block_device;
>   struct scatterlist;
>   
> @@ -43,6 +49,11 @@ int pci_p2pdma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
>   		int nents, enum dma_data_direction dir, unsigned long attrs);
>   void pci_p2pdma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
>   		int nents, enum dma_data_direction dir, unsigned long attrs);
> +int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +		struct device *dev, struct scatterlist *sg,
> +		unsigned long dma_attrs);
> +void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +				struct scatterlist *dma_sg);
>   int pci_p2pdma_enable_store(const char *page, struct pci_dev **p2p_dev,
>   			    bool *use_p2pdma);
>   ssize_t pci_p2pdma_enable_show(char *page, struct pci_dev *p2p_dev,
> @@ -109,6 +120,16 @@ static inline void pci_p2pdma_unmap_sg_attrs(struct device *dev,
>   		unsigned long attrs)
>   {
>   }
> +static inline int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +		struct device *dev, struct scatterlist *sg,
> +		unsigned long dma_attrs)
> +{
> +	return 0;
> +}
> +static inline void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +					      struct scatterlist *dma_sg)
> +{
> +}
>   static inline int pci_p2pdma_enable_store(const char *page,
>   		struct pci_dev **p2p_dev, bool *use_p2pdma)
>   {
> 


WARNING: multiple messages have this Message-ID (diff)
From: John Hubbard <jhubbard@nvidia.com>
To: Logan Gunthorpe <logang@deltatee.com>,
	<linux-kernel@vger.kernel.org>, <linux-nvme@lists.infradead.org>,
	<linux-block@vger.kernel.org>, <linux-pci@vger.kernel.org>,
	<linux-mm@kvack.org>, <iommu@lists.linux-foundation.org>
Cc: "Stephen Bates" <sbates@raithlin.com>,
	"Christoph Hellwig" <hch@lst.de>,
	"Dan Williams" <dan.j.williams@intel.com>,
	"Jason Gunthorpe" <jgg@ziepe.ca>,
	"Christian König" <christian.koenig@amd.com>,
	"Don Dutile" <ddutile@redhat.com>,
	"Matthew Wilcox" <willy@infradead.org>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Jakowski Andrzej" <andrzej.jakowski@intel.com>,
	"Minturn Dave B" <dave.b.minturn@intel.com>,
	"Jason Ekstrand" <jason@jlekstrand.net>,
	"Dave Hansen" <dave.hansen@linux.intel.com>,
	"Xiong Jianxin" <jianxin.xiong@intel.com>,
	"Bjorn Helgaas" <helgaas@kernel.org>,
	"Ira Weiny" <ira.weiny@intel.com>,
	"Robin Murphy" <robin.murphy@arm.com>
Subject: Re: [PATCH 08/16] PCI/P2PDMA: Introduce helpers for dma_map_sg implementations
Date: Sun, 2 May 2021 17:50:39 -0700	[thread overview]
Message-ID: <e27d35f8-5c3a-39e3-9845-6d2bf15cc8b3@nvidia.com> (raw)
In-Reply-To: <20210408170123.8788-9-logang@deltatee.com>

On 4/8/21 10:01 AM, Logan Gunthorpe wrote:
> Add pci_p2pdma_map_segment() as a helper for simple dma_map_sg()
> implementations. It takes an scatterlist segment that must point to a
> pci_p2pdma struct page and will map it if the mapping requires a bus
> address.
> 
> The return value indicates whether the mapping required a bus address
> or whether the caller still needs to map the segment normally. If the
> segment should not be mapped, -EREMOTEIO is returned.
> 
> This helper uses a state structure to track the changes to the
> pgmap across calls and avoid needing to lookup into the xarray for
> every page.
> 

OK, coming back to this patch, after seeing how it is used later in
the series...

> Also add pci_p2pdma_map_bus_segment() which is useful for IOMMU
> dma_map_sg() implementations where the sg segment containing the page
> differs from the sg segment containing the DMA address.
> 
> Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
> ---
>   drivers/pci/p2pdma.c       | 65 ++++++++++++++++++++++++++++++++++++++
>   include/linux/pci-p2pdma.h | 21 ++++++++++++
>   2 files changed, 86 insertions(+)
> 
> diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
> index 38c93f57a941..44ad7664e875 100644
> --- a/drivers/pci/p2pdma.c
> +++ b/drivers/pci/p2pdma.c
> @@ -923,6 +923,71 @@ void pci_p2pdma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
>   }
>   EXPORT_SYMBOL_GPL(pci_p2pdma_unmap_sg_attrs);
>   
> +/**
> + * pci_p2pdma_map_segment - map an sg segment determining the mapping type
> + * @state: State structure that should be declared on the stack outside of
> + *	the for_each_sg() loop and initialized to zero.

Silly fine point for the docs here: it doesn't actually have to be on
the stack, so I don't think you need to write that constraint in the
documentation. It just has be be somehow allocated and zeroed.


> + * @dev: DMA device that's doing the mapping operation
> + * @sg: scatterlist segment to map
> + * @attrs: dma mapping attributes
> + *
> + * This is a helper to be used by non-iommu dma_map_sg() implementations where
> + * the sg segment is the same for the page_link and the dma_address.
> + *
> + * Attempt to map a single segment in an SGL with the PCI bus address.
> + * The segment must point to a PCI P2PDMA page and thus must be
> + * wrapped in a is_pci_p2pdma_page(sg_page(sg)) check.

Should this be backed up with actual checks in the function, that
the prerequisites are met?

> + *
> + * Returns 1 if the segment was mapped, 0 if the segment should be mapped
> + * directly (or through the IOMMU) and -EREMOTEIO if the segment should not
> + * be mapped at all.
> + */
> +int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +			   struct device *dev, struct scatterlist *sg,
> +			   unsigned long dma_attrs)
> +{
> +	if (state->pgmap != sg_page(sg)->pgmap) {
> +		state->pgmap = sg_page(sg)->pgmap;
> +		state->map = pci_p2pdma_map_type(state->pgmap, dev, dma_attrs);
> +		state->bus_off = to_p2p_pgmap(state->pgmap)->bus_offset;
> +	}

I'll quote myself from patch 9, because I had a comment there that actually
was meant for this patch:

Is it worth putting this stuff on the caller's stack? I mean, is there a
noticeable performance improvement from caching the state? Because if
it's invisible, then simplicity is better. I suspect you're right, and
that it *is* worth it, but it's good to know for real.


> +
> +	switch (state->map) {
> +	case PCI_P2PDMA_MAP_BUS_ADDR:
> +		sg->dma_address = sg_phys(sg) + state->bus_off;
> +		sg_dma_len(sg) = sg->length;
> +		sg_mark_pci_p2pdma(sg);
> +		return 1;
> +	case PCI_P2PDMA_MAP_THRU_HOST_BRIDGE:
> +		return 0;
> +	default:
> +		return -EREMOTEIO;
> +	}
> +}
> +
> +/**
> + * pci_p2pdma_map_bus_segment - map an sg segment pre determined to
> + *	be mapped with PCI_P2PDMA_MAP_BUS_ADDR

Or:

  * pci_p2pdma_map_bus_segment - map an SG segment that is already known
  * to be mapped with PCI_P2PDMA_MAP_BUS_ADDR

Also, should that prerequisite be backed up with checks in the function?

> + * @pg_sg: scatterlist segment with the page to map
> + * @dma_sg: scatterlist segment to assign a dma address to
> + *
> + * This is a helper for iommu dma_map_sg() implementations when the
> + * segment for the dma address differs from the segment containing the
> + * source page.
> + *
> + * pci_p2pdma_map_type() must have already been called on the pg_sg and
> + * returned PCI_P2PDMA_MAP_BUS_ADDR.

Another prerequisite, so same question: do you think that the code should
also check that this prerequisite is met?

thanks,
-- 
John Hubbard
NVIDIA

> + */
> +void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +				struct scatterlist *dma_sg)
> +{
> +	struct pci_p2pdma_pagemap *pgmap = to_p2p_pgmap(sg_page(pg_sg)->pgmap);
> +
> +	dma_sg->dma_address = sg_phys(pg_sg) + pgmap->bus_offset;
> +	sg_dma_len(dma_sg) = pg_sg->length;
> +	sg_mark_pci_p2pdma(dma_sg);
> +}
> +
>   /**
>    * pci_p2pdma_enable_store - parse a configfs/sysfs attribute store
>    *		to enable p2pdma
> diff --git a/include/linux/pci-p2pdma.h b/include/linux/pci-p2pdma.h
> index a06072ac3a52..49e7679403cf 100644
> --- a/include/linux/pci-p2pdma.h
> +++ b/include/linux/pci-p2pdma.h
> @@ -13,6 +13,12 @@
>   
>   #include <linux/pci.h>
>   
> +struct pci_p2pdma_map_state {
> +	struct dev_pagemap *pgmap;
> +	int map;
> +	u64 bus_off;
> +};
> +
>   struct block_device;
>   struct scatterlist;
>   
> @@ -43,6 +49,11 @@ int pci_p2pdma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
>   		int nents, enum dma_data_direction dir, unsigned long attrs);
>   void pci_p2pdma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
>   		int nents, enum dma_data_direction dir, unsigned long attrs);
> +int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +		struct device *dev, struct scatterlist *sg,
> +		unsigned long dma_attrs);
> +void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +				struct scatterlist *dma_sg);
>   int pci_p2pdma_enable_store(const char *page, struct pci_dev **p2p_dev,
>   			    bool *use_p2pdma);
>   ssize_t pci_p2pdma_enable_show(char *page, struct pci_dev *p2p_dev,
> @@ -109,6 +120,16 @@ static inline void pci_p2pdma_unmap_sg_attrs(struct device *dev,
>   		unsigned long attrs)
>   {
>   }
> +static inline int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +		struct device *dev, struct scatterlist *sg,
> +		unsigned long dma_attrs)
> +{
> +	return 0;
> +}
> +static inline void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +					      struct scatterlist *dma_sg)
> +{
> +}
>   static inline int pci_p2pdma_enable_store(const char *page,
>   		struct pci_dev **p2p_dev, bool *use_p2pdma)
>   {
> 


_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

WARNING: multiple messages have this Message-ID (diff)
From: John Hubbard <jhubbard@nvidia.com>
To: Logan Gunthorpe <logang@deltatee.com>,
	<linux-kernel@vger.kernel.org>, <linux-nvme@lists.infradead.org>,
	<linux-block@vger.kernel.org>, <linux-pci@vger.kernel.org>,
	<linux-mm@kvack.org>, <iommu@lists.linux-foundation.org>
Cc: "Minturn Dave B" <dave.b.minturn@intel.com>,
	"Ira Weiny" <ira.weiny@intel.com>,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Dave Hansen" <dave.hansen@linux.intel.com>,
	"Robin Murphy" <robin.murphy@arm.com>,
	"Matthew Wilcox" <willy@infradead.org>,
	"Christian König" <christian.koenig@amd.com>,
	"Jason Gunthorpe" <jgg@ziepe.ca>,
	"Jason Ekstrand" <jason@jlekstrand.net>,
	"Bjorn Helgaas" <helgaas@kernel.org>,
	"Dan Williams" <dan.j.williams@intel.com>,
	"Stephen Bates" <sbates@raithlin.com>,
	"Jakowski Andrzej" <andrzej.jakowski@intel.com>,
	"Christoph Hellwig" <hch@lst.de>,
	"Xiong Jianxin" <jianxin.xiong@intel.com>
Subject: Re: [PATCH 08/16] PCI/P2PDMA: Introduce helpers for dma_map_sg implementations
Date: Sun, 2 May 2021 17:50:39 -0700	[thread overview]
Message-ID: <e27d35f8-5c3a-39e3-9845-6d2bf15cc8b3@nvidia.com> (raw)
In-Reply-To: <20210408170123.8788-9-logang@deltatee.com>

On 4/8/21 10:01 AM, Logan Gunthorpe wrote:
> Add pci_p2pdma_map_segment() as a helper for simple dma_map_sg()
> implementations. It takes an scatterlist segment that must point to a
> pci_p2pdma struct page and will map it if the mapping requires a bus
> address.
> 
> The return value indicates whether the mapping required a bus address
> or whether the caller still needs to map the segment normally. If the
> segment should not be mapped, -EREMOTEIO is returned.
> 
> This helper uses a state structure to track the changes to the
> pgmap across calls and avoid needing to lookup into the xarray for
> every page.
> 

OK, coming back to this patch, after seeing how it is used later in
the series...

> Also add pci_p2pdma_map_bus_segment() which is useful for IOMMU
> dma_map_sg() implementations where the sg segment containing the page
> differs from the sg segment containing the DMA address.
> 
> Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
> ---
>   drivers/pci/p2pdma.c       | 65 ++++++++++++++++++++++++++++++++++++++
>   include/linux/pci-p2pdma.h | 21 ++++++++++++
>   2 files changed, 86 insertions(+)
> 
> diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
> index 38c93f57a941..44ad7664e875 100644
> --- a/drivers/pci/p2pdma.c
> +++ b/drivers/pci/p2pdma.c
> @@ -923,6 +923,71 @@ void pci_p2pdma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
>   }
>   EXPORT_SYMBOL_GPL(pci_p2pdma_unmap_sg_attrs);
>   
> +/**
> + * pci_p2pdma_map_segment - map an sg segment determining the mapping type
> + * @state: State structure that should be declared on the stack outside of
> + *	the for_each_sg() loop and initialized to zero.

Silly fine point for the docs here: it doesn't actually have to be on
the stack, so I don't think you need to write that constraint in the
documentation. It just has be be somehow allocated and zeroed.


> + * @dev: DMA device that's doing the mapping operation
> + * @sg: scatterlist segment to map
> + * @attrs: dma mapping attributes
> + *
> + * This is a helper to be used by non-iommu dma_map_sg() implementations where
> + * the sg segment is the same for the page_link and the dma_address.
> + *
> + * Attempt to map a single segment in an SGL with the PCI bus address.
> + * The segment must point to a PCI P2PDMA page and thus must be
> + * wrapped in a is_pci_p2pdma_page(sg_page(sg)) check.

Should this be backed up with actual checks in the function, that
the prerequisites are met?

> + *
> + * Returns 1 if the segment was mapped, 0 if the segment should be mapped
> + * directly (or through the IOMMU) and -EREMOTEIO if the segment should not
> + * be mapped at all.
> + */
> +int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +			   struct device *dev, struct scatterlist *sg,
> +			   unsigned long dma_attrs)
> +{
> +	if (state->pgmap != sg_page(sg)->pgmap) {
> +		state->pgmap = sg_page(sg)->pgmap;
> +		state->map = pci_p2pdma_map_type(state->pgmap, dev, dma_attrs);
> +		state->bus_off = to_p2p_pgmap(state->pgmap)->bus_offset;
> +	}

I'll quote myself from patch 9, because I had a comment there that actually
was meant for this patch:

Is it worth putting this stuff on the caller's stack? I mean, is there a
noticeable performance improvement from caching the state? Because if
it's invisible, then simplicity is better. I suspect you're right, and
that it *is* worth it, but it's good to know for real.


> +
> +	switch (state->map) {
> +	case PCI_P2PDMA_MAP_BUS_ADDR:
> +		sg->dma_address = sg_phys(sg) + state->bus_off;
> +		sg_dma_len(sg) = sg->length;
> +		sg_mark_pci_p2pdma(sg);
> +		return 1;
> +	case PCI_P2PDMA_MAP_THRU_HOST_BRIDGE:
> +		return 0;
> +	default:
> +		return -EREMOTEIO;
> +	}
> +}
> +
> +/**
> + * pci_p2pdma_map_bus_segment - map an sg segment pre determined to
> + *	be mapped with PCI_P2PDMA_MAP_BUS_ADDR

Or:

  * pci_p2pdma_map_bus_segment - map an SG segment that is already known
  * to be mapped with PCI_P2PDMA_MAP_BUS_ADDR

Also, should that prerequisite be backed up with checks in the function?

> + * @pg_sg: scatterlist segment with the page to map
> + * @dma_sg: scatterlist segment to assign a dma address to
> + *
> + * This is a helper for iommu dma_map_sg() implementations when the
> + * segment for the dma address differs from the segment containing the
> + * source page.
> + *
> + * pci_p2pdma_map_type() must have already been called on the pg_sg and
> + * returned PCI_P2PDMA_MAP_BUS_ADDR.

Another prerequisite, so same question: do you think that the code should
also check that this prerequisite is met?

thanks,
-- 
John Hubbard
NVIDIA

> + */
> +void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +				struct scatterlist *dma_sg)
> +{
> +	struct pci_p2pdma_pagemap *pgmap = to_p2p_pgmap(sg_page(pg_sg)->pgmap);
> +
> +	dma_sg->dma_address = sg_phys(pg_sg) + pgmap->bus_offset;
> +	sg_dma_len(dma_sg) = pg_sg->length;
> +	sg_mark_pci_p2pdma(dma_sg);
> +}
> +
>   /**
>    * pci_p2pdma_enable_store - parse a configfs/sysfs attribute store
>    *		to enable p2pdma
> diff --git a/include/linux/pci-p2pdma.h b/include/linux/pci-p2pdma.h
> index a06072ac3a52..49e7679403cf 100644
> --- a/include/linux/pci-p2pdma.h
> +++ b/include/linux/pci-p2pdma.h
> @@ -13,6 +13,12 @@
>   
>   #include <linux/pci.h>
>   
> +struct pci_p2pdma_map_state {
> +	struct dev_pagemap *pgmap;
> +	int map;
> +	u64 bus_off;
> +};
> +
>   struct block_device;
>   struct scatterlist;
>   
> @@ -43,6 +49,11 @@ int pci_p2pdma_map_sg_attrs(struct device *dev, struct scatterlist *sg,
>   		int nents, enum dma_data_direction dir, unsigned long attrs);
>   void pci_p2pdma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg,
>   		int nents, enum dma_data_direction dir, unsigned long attrs);
> +int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +		struct device *dev, struct scatterlist *sg,
> +		unsigned long dma_attrs);
> +void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +				struct scatterlist *dma_sg);
>   int pci_p2pdma_enable_store(const char *page, struct pci_dev **p2p_dev,
>   			    bool *use_p2pdma);
>   ssize_t pci_p2pdma_enable_show(char *page, struct pci_dev *p2p_dev,
> @@ -109,6 +120,16 @@ static inline void pci_p2pdma_unmap_sg_attrs(struct device *dev,
>   		unsigned long attrs)
>   {
>   }
> +static inline int pci_p2pdma_map_segment(struct pci_p2pdma_map_state *state,
> +		struct device *dev, struct scatterlist *sg,
> +		unsigned long dma_attrs)
> +{
> +	return 0;
> +}
> +static inline void pci_p2pdma_map_bus_segment(struct scatterlist *pg_sg,
> +					      struct scatterlist *dma_sg)
> +{
> +}
>   static inline int pci_p2pdma_enable_store(const char *page,
>   		struct pci_dev **p2p_dev, bool *use_p2pdma)
>   {
> 

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

  parent reply	other threads:[~2021-05-03  0:51 UTC|newest]

Thread overview: 297+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-08 17:01 [PATCH 00/16] Add new DMA mapping operation for P2PDMA Logan Gunthorpe
2021-04-08 17:01 ` Logan Gunthorpe
2021-04-08 17:01 ` Logan Gunthorpe
2021-04-08 17:01 ` [PATCH 01/16] PCI/P2PDMA: Pass gfp_mask flags to upstream_bridge_distance_warn() Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-02  3:58   ` John Hubbard
2021-05-02  3:58     ` John Hubbard
2021-05-02  3:58     ` John Hubbard
2021-05-03 15:57     ` Logan Gunthorpe
2021-05-03 15:57       ` Logan Gunthorpe
2021-05-03 15:57       ` Logan Gunthorpe
2021-05-03 18:17       ` John Hubbard
2021-05-03 18:17         ` John Hubbard
2021-05-03 18:17         ` John Hubbard
2021-05-03 18:20         ` Logan Gunthorpe
2021-05-03 18:20           ` Logan Gunthorpe
2021-05-03 18:20           ` Logan Gunthorpe
2021-05-03 18:23           ` John Hubbard
2021-05-03 18:23             ` John Hubbard
2021-05-03 18:23             ` John Hubbard
2021-05-03 18:24         ` Christoph Hellwig
2021-05-03 18:24           ` Christoph Hellwig
2021-05-03 18:24           ` Christoph Hellwig
2021-05-11 16:05     ` Don Dutile
2021-05-11 16:05       ` Don Dutile
2021-05-11 16:05       ` Don Dutile
2021-05-11 16:12       ` Logan Gunthorpe
2021-05-11 16:12         ` Logan Gunthorpe
2021-05-11 16:12         ` Logan Gunthorpe
2021-05-11 16:23         ` Don Dutile
2021-05-11 16:23           ` Don Dutile
2021-05-11 16:23           ` Don Dutile
2021-04-08 17:01 ` [PATCH 02/16] PCI/P2PDMA: Avoid pci_get_slot() which sleeps Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-02  5:35   ` John Hubbard
2021-05-02  5:35     ` John Hubbard
2021-05-02  5:35     ` John Hubbard
2021-05-03 16:08     ` Logan Gunthorpe
2021-05-03 16:08       ` Logan Gunthorpe
2021-05-03 16:08       ` Logan Gunthorpe
2021-05-03 18:20       ` John Hubbard
2021-05-03 18:20         ` John Hubbard
2021-05-03 18:20         ` John Hubbard
2021-05-03 18:25       ` Christoph Hellwig
2021-05-03 18:25         ` Christoph Hellwig
2021-05-03 18:25         ` Christoph Hellwig
2021-05-11 16:05     ` Don Dutile
2021-05-11 16:05       ` Don Dutile
2021-05-11 16:05       ` Don Dutile
2021-05-11 16:16       ` Logan Gunthorpe
2021-05-11 16:16         ` Logan Gunthorpe
2021-05-11 16:16         ` Logan Gunthorpe
2021-05-11 16:05   ` Don Dutile
2021-05-11 16:05     ` Don Dutile
2021-05-11 16:05     ` Don Dutile
2021-05-11 16:14     ` Logan Gunthorpe
2021-05-11 16:14       ` Logan Gunthorpe
2021-05-11 16:14       ` Logan Gunthorpe
2021-04-08 17:01 ` [PATCH 03/16] PCI/P2PDMA: Attempt to set map_type if it has not been set Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-02 19:58   ` John Hubbard
2021-05-02 19:58     ` John Hubbard
2021-05-02 19:58     ` John Hubbard
2021-05-03 16:17     ` Logan Gunthorpe
2021-05-03 16:17       ` Logan Gunthorpe
2021-05-03 16:17       ` Logan Gunthorpe
2021-05-03 18:22       ` John Hubbard
2021-05-03 18:22         ` John Hubbard
2021-05-03 18:22         ` John Hubbard
2021-05-03 18:35       ` Christoph Hellwig
2021-05-03 18:35         ` Christoph Hellwig
2021-05-03 18:35         ` Christoph Hellwig
2021-05-03 18:46         ` Logan Gunthorpe
2021-05-03 18:46           ` Logan Gunthorpe
2021-05-03 18:46           ` Logan Gunthorpe
2021-05-11 16:05     ` Don Dutile
2021-05-11 16:05       ` Don Dutile
2021-05-11 16:05       ` Don Dutile
2021-04-08 17:01 ` [PATCH 04/16] PCI/P2PDMA: Refactor pci_p2pdma_map_type() to take pagmap and device Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-02 20:41   ` John Hubbard
2021-05-02 20:41     ` John Hubbard
2021-05-02 20:41     ` John Hubbard
2021-05-03 16:30     ` Logan Gunthorpe
2021-05-03 16:30       ` Logan Gunthorpe
2021-05-03 16:30       ` Logan Gunthorpe
2021-05-03 18:31       ` John Hubbard
2021-05-03 18:31         ` John Hubbard
2021-05-03 18:31         ` John Hubbard
2021-05-03 18:56         ` Logan Gunthorpe
2021-05-03 18:56           ` Logan Gunthorpe
2021-05-03 18:56           ` Logan Gunthorpe
2021-05-03 21:54           ` John Hubbard
2021-05-03 21:54             ` John Hubbard
2021-05-03 21:54             ` John Hubbard
2021-05-03 22:57             ` Jason Gunthorpe
2021-05-03 22:57               ` Jason Gunthorpe
2021-05-03 22:57               ` Jason Gunthorpe
2021-05-03 23:40               ` John Hubbard
2021-05-03 23:40                 ` John Hubbard
2021-05-03 23:40                 ` John Hubbard
2021-04-08 17:01 ` [PATCH 05/16] dma-mapping: Introduce dma_map_sg_p2pdma() Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-27 19:22   ` Jason Gunthorpe
2021-04-27 19:22     ` Jason Gunthorpe
2021-04-27 19:22     ` Jason Gunthorpe
2021-04-27 22:49     ` Logan Gunthorpe
2021-04-27 22:49       ` Logan Gunthorpe
2021-04-27 22:49       ` Logan Gunthorpe
2021-04-27 19:31   ` Jason Gunthorpe
2021-04-27 19:31     ` Jason Gunthorpe
2021-04-27 19:31     ` Jason Gunthorpe
2021-04-27 22:55     ` Logan Gunthorpe
2021-04-27 22:55       ` Logan Gunthorpe
2021-04-27 22:55       ` Logan Gunthorpe
2021-04-27 23:01       ` Jason Gunthorpe
2021-04-27 23:01         ` Jason Gunthorpe
2021-04-27 23:01         ` Jason Gunthorpe
2021-05-03 18:28         ` Christoph Hellwig
2021-05-03 18:28           ` Christoph Hellwig
2021-05-03 18:28           ` Christoph Hellwig
2021-05-03 18:31           ` Logan Gunthorpe
2021-05-03 18:31             ` Logan Gunthorpe
2021-05-03 18:31             ` Logan Gunthorpe
2021-05-02 21:23   ` John Hubbard
2021-05-02 21:23     ` John Hubbard
2021-05-02 21:23     ` John Hubbard
2021-05-03 16:38     ` Logan Gunthorpe
2021-05-03 16:38       ` Logan Gunthorpe
2021-05-03 16:38       ` Logan Gunthorpe
2021-05-11 16:05   ` Don Dutile
2021-05-11 16:05     ` Don Dutile
2021-05-11 16:05     ` Don Dutile
2021-04-08 17:01 ` [PATCH 06/16] lib/scatterlist: Add flag for indicating P2PDMA segments in an SGL Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-02 22:34   ` John Hubbard
2021-05-02 22:34     ` John Hubbard
2021-05-02 22:34     ` John Hubbard
2021-04-08 17:01 ` [PATCH 07/16] PCI/P2PDMA: Make pci_p2pdma_map_type() non-static Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-02 22:44   ` John Hubbard
2021-05-02 22:44     ` John Hubbard
2021-05-02 22:44     ` John Hubbard
2021-05-03 16:39     ` Logan Gunthorpe
2021-05-03 16:39       ` Logan Gunthorpe
2021-05-03 16:39       ` Logan Gunthorpe
2021-05-11 16:06   ` Don Dutile
2021-05-11 16:06     ` Don Dutile
2021-05-11 16:06     ` Don Dutile
2021-05-11 16:17     ` Logan Gunthorpe
2021-05-11 16:17       ` Logan Gunthorpe
2021-05-11 16:17       ` Logan Gunthorpe
2021-04-08 17:01 ` [PATCH 08/16] PCI/P2PDMA: Introduce helpers for dma_map_sg implementations Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-02 22:52   ` John Hubbard
2021-05-02 22:52     ` John Hubbard
2021-05-02 22:52     ` John Hubbard
2021-05-03  0:50   ` John Hubbard [this message]
2021-05-03  0:50     ` John Hubbard
2021-05-03  0:50     ` John Hubbard
2021-05-03 17:15     ` Logan Gunthorpe
2021-05-03 17:15       ` Logan Gunthorpe
2021-05-03 17:15       ` Logan Gunthorpe
2021-04-08 17:01 ` [PATCH 09/16] dma-direct: Support PCI P2PDMA pages in dma-direct map_sg Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-27 19:33   ` Jason Gunthorpe
2021-04-27 19:33     ` Jason Gunthorpe
2021-04-27 19:33     ` Jason Gunthorpe
2021-04-27 19:40     ` Jason Gunthorpe
2021-04-27 19:40       ` Jason Gunthorpe
2021-04-27 19:40       ` Jason Gunthorpe
2021-04-27 22:56       ` Logan Gunthorpe
2021-04-27 22:56         ` Logan Gunthorpe
2021-04-27 22:56         ` Logan Gunthorpe
2021-05-02 23:28   ` John Hubbard
2021-05-02 23:28     ` John Hubbard
2021-05-02 23:28     ` John Hubbard
2021-05-02 23:32     ` John Hubbard
2021-05-02 23:32       ` John Hubbard
2021-05-02 23:32       ` John Hubbard
2021-05-03 17:06       ` Logan Gunthorpe
2021-05-03 17:06         ` Logan Gunthorpe
2021-05-03 17:06         ` Logan Gunthorpe
2021-05-03 16:55     ` Logan Gunthorpe
2021-05-03 16:55       ` Logan Gunthorpe
2021-05-03 16:55       ` Logan Gunthorpe
2021-05-04  0:12       ` John Hubbard
2021-05-04  0:12         ` John Hubbard
2021-05-04  0:12         ` John Hubbard
2021-05-03 17:04     ` Logan Gunthorpe
2021-05-03 17:04       ` Logan Gunthorpe
2021-05-03 17:04       ` Logan Gunthorpe
2021-05-04  0:01       ` John Hubbard
2021-05-04  0:01         ` John Hubbard
2021-05-04  0:01         ` John Hubbard
2021-04-08 17:01 ` [PATCH 10/16] dma-mapping: Add flags to dma_map_ops to indicate PCI P2PDMA support Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-03  0:32   ` John Hubbard
2021-05-03  0:32     ` John Hubbard
2021-05-03  0:32     ` John Hubbard
2021-05-03 17:09     ` Logan Gunthorpe
2021-05-03 17:09       ` Logan Gunthorpe
2021-05-03 17:09       ` Logan Gunthorpe
2021-05-11 16:06   ` Don Dutile
2021-05-11 16:06     ` Don Dutile
2021-05-11 16:06     ` Don Dutile
2021-05-11 16:19     ` Logan Gunthorpe
2021-05-11 16:19       ` Logan Gunthorpe
2021-05-11 16:19       ` Logan Gunthorpe
2021-04-08 17:01 ` [PATCH 11/16] iommu/dma: Support PCI P2PDMA pages in dma-iommu map_sg Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-27 19:43   ` Jason Gunthorpe
2021-04-27 19:43     ` Jason Gunthorpe
2021-04-27 19:43     ` Jason Gunthorpe
2021-04-27 22:59     ` Logan Gunthorpe
2021-04-27 22:59       ` Logan Gunthorpe
2021-04-27 22:59       ` Logan Gunthorpe
2021-05-03  1:14   ` John Hubbard
2021-05-03  1:14     ` John Hubbard
2021-05-03  1:14     ` John Hubbard
2021-05-06 23:59     ` Logan Gunthorpe
2021-05-06 23:59       ` Logan Gunthorpe
2021-05-06 23:59       ` Logan Gunthorpe
2021-05-11 16:06   ` Don Dutile
2021-05-11 16:06     ` Don Dutile
2021-05-11 16:06     ` Don Dutile
2021-05-11 16:35     ` Logan Gunthorpe
2021-05-11 16:35       ` Logan Gunthorpe
2021-05-11 16:35       ` Logan Gunthorpe
2021-04-08 17:01 ` [PATCH 12/16] nvme-pci: Check DMA ops when indicating support for PCI P2PDMA Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-03  1:29   ` John Hubbard
2021-05-03  1:29     ` John Hubbard
2021-05-03  1:29     ` John Hubbard
2021-05-03 17:17     ` Logan Gunthorpe
2021-05-03 17:17       ` Logan Gunthorpe
2021-05-03 17:17       ` Logan Gunthorpe
2021-05-04  0:17       ` John Hubbard
2021-05-04  0:17         ` John Hubbard
2021-05-04  0:17         ` John Hubbard
2021-04-08 17:01 ` [PATCH 13/16] nvme-pci: Convert to using dma_map_sg_p2pdma for p2pdma pages Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-05-03  1:34   ` John Hubbard
2021-05-03  1:34     ` John Hubbard
2021-05-03  1:34     ` John Hubbard
2021-05-03 17:19     ` Logan Gunthorpe
2021-05-03 17:19       ` Logan Gunthorpe
2021-05-03 17:19       ` Logan Gunthorpe
2021-05-04  0:26       ` John Hubbard
2021-05-04  0:26         ` John Hubbard
2021-05-04  0:26         ` John Hubbard
2021-04-08 17:01 ` [PATCH 14/16] nvme-rdma: Ensure dma support when using p2pdma Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-27 19:47   ` Jason Gunthorpe
2021-04-27 19:47     ` Jason Gunthorpe
2021-04-27 19:47     ` Jason Gunthorpe
2021-04-27 22:59     ` Logan Gunthorpe
2021-04-27 22:59       ` Logan Gunthorpe
2021-04-27 22:59       ` Logan Gunthorpe
2021-05-03  1:37   ` John Hubbard
2021-05-03  1:37     ` John Hubbard
2021-05-03  1:37     ` John Hubbard
2021-04-08 17:01 ` [PATCH 15/16] RDMA/rw: use dma_map_sg_p2pdma() Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01 ` [PATCH 16/16] PCI/P2PDMA: Remove pci_p2pdma_[un]map_sg() Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-08 17:01   ` Logan Gunthorpe
2021-04-27 19:28 ` [PATCH 00/16] Add new DMA mapping operation for P2PDMA Jason Gunthorpe
2021-04-27 19:28   ` Jason Gunthorpe
2021-04-27 19:28   ` Jason Gunthorpe
2021-04-27 20:21   ` John Hubbard
2021-04-27 20:21     ` John Hubbard
2021-04-27 20:21     ` John Hubbard
2021-04-27 20:48     ` Dan Williams
2021-04-27 20:48       ` Dan Williams
2021-04-27 20:48       ` Dan Williams
2021-05-02  1:22 ` John Hubbard
2021-05-02  1:22   ` John Hubbard
2021-05-02  1:22   ` John Hubbard
2021-05-11 16:05 ` Don Dutile
2021-05-11 16:05   ` Don Dutile
2021-05-11 16:05   ` Don Dutile

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=e27d35f8-5c3a-39e3-9845-6d2bf15cc8b3@nvidia.com \
    --to=jhubbard@nvidia.com \
    --cc=andrzej.jakowski@intel.com \
    --cc=christian.koenig@amd.com \
    --cc=dan.j.williams@intel.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dave.b.minturn@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=ddutile@redhat.com \
    --cc=hch@lst.de \
    --cc=helgaas@kernel.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=ira.weiny@intel.com \
    --cc=jason@jlekstrand.net \
    --cc=jgg@ziepe.ca \
    --cc=jianxin.xiong@intel.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=logang@deltatee.com \
    --cc=robin.murphy@arm.com \
    --cc=sbates@raithlin.com \
    --cc=willy@infradead.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 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.