nvdimm.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Logan Gunthorpe <logang@deltatee.com>
Cc: "Jens Axboe" <axboe@kernel.dk>,
	"Alex Williamson" <alex.williamson@redhat.com>,
	linux-nvdimm@lists.01.org, linux-rdma@vger.kernel.org,
	linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-nvme@lists.infradead.org, linux-block@vger.kernel.org,
	"Jérôme Glisse" <jglisse@redhat.com>,
	"Jason Gunthorpe" <jgg@mellanox.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Benjamin Herrenschmidt" <benh@kernel.crashing.org>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Max Gurtovoy" <maxg@mellanox.com>,
	"Christoph Hellwig" <hch@lst.de>
Subject: Re: [PATCH v6 04/13] PCI/P2PDMA: Introduce configfs/sysfs enable attribute helpers
Date: Fri, 21 Sep 2018 11:18:58 -0500	[thread overview]
Message-ID: <20180921161858.GH224714@bhelgaas-glaptop.roam.corp.google.com> (raw)
In-Reply-To: <20180913001156.4115-5-logang@deltatee.com>

On Wed, Sep 12, 2018 at 06:11:47PM -0600, Logan Gunthorpe wrote:
> Users of the P2PDMA infrastructure will typically need a way for
> the user to tell the kernel to use P2P resources. Typically
> this will be a simple on/off boolean operation but sometimes
> it may be desirable for the user to specify the exact device to
> use for the P2P operation.
> 
> Add new helpers for attributes which take a boolean or a PCI device.
> Any boolean, or the word 'auto' turn P2P on or off. Specifying a full
> PCI device name/BDF will select the specific device.

I think examples of the valid booleans would be useful.  "Boolean"
suggests true/false, but AFAICT strtobool() only works for things
like 0/1/on/off.

What's the need for "auto"?  Sounds like it's equivalent to "on" but
it's not obvious why we need both.

It'd be sort of nice if the contents of the sysfs file were valid
things you could put *back* into it.  But it looks like the contents
might be "none", which isn't valid for the store.  And the contents
are never "on" or "off".

Where do these store/show functions get connected to sysfs?  I know
there's a lot of magic there, so apologies if I'm missing it.

> Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
> ---
>  drivers/pci/p2pdma.c       | 83 ++++++++++++++++++++++++++++++++++++++
>  include/linux/pci-p2pdma.h | 15 +++++++
>  2 files changed, 98 insertions(+)
> 
> diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
> index 29bd40a87768..3da848f3fe72 100644
> --- a/drivers/pci/p2pdma.c
> +++ b/drivers/pci/p2pdma.c
> @@ -9,6 +9,7 @@
>   */
>  
>  #define pr_fmt(fmt) "pci-p2pdma: " fmt
> +#include <linux/ctype.h>
>  #include <linux/pci-p2pdma.h>
>  #include <linux/module.h>
>  #include <linux/slab.h>
> @@ -856,3 +857,85 @@ int pci_p2pdma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
>  	return nents;
>  }
>  EXPORT_SYMBOL_GPL(pci_p2pdma_map_sg);
> +
> +/**
> + * pci_p2pdma_enable_store - parse a configfs/sysfs attribute store
> + *		to enable p2pdma
> + * @page: contents of the value to be stored
> + * @p2p_dev: returns the PCI device that was selected to be used
> + *		(if 'auto', 'none or a boolean isn't the store value)
> + * @use_p2pdma: returns whether to enable p2pdma or not
> + *
> + * Parses an attribute value to decide whether to enable p2pdma.
> + * The value can select a PCI device (using it's full BDF device
> + * name), a boolean, or 'auto'. 'auto' and a true boolean value
> + * have the same meaning. A false value disables p2pdma and
> + * a PCI device enables it to use a specific device as the
> + * backing provider.
> + *
> + * pci_p2pdma_enable_show() should be used as the show operation for
> + * the attribute.
> + *
> + * Returns 0 on success
> + */
> +int pci_p2pdma_enable_store(const char *page, struct pci_dev **p2p_dev,
> +			    bool *use_p2pdma)
> +{
> +	struct device *dev;
> +
> +	dev = bus_find_device_by_name(&pci_bus_type, NULL, page);
> +	if (dev) {
> +		*use_p2pdma = true;
> +		*p2p_dev = to_pci_dev(dev);
> +
> +		if (!pci_has_p2pmem(*p2p_dev)) {
> +			pr_err("PCI device has no peer-to-peer memory: %s\n",

pci_err()?

> +			       page);
> +			pci_dev_put(*p2p_dev);
> +			return -ENODEV;
> +		}
> +
> +		return 0;
> +	} else if (sysfs_streq(page, "auto")) {
> +		*use_p2pdma = true;
> +		return 0;
> +	} else if ((page[0] == '0' || page[0] == '1') && !iscntrl(page[1])) {
> +		/*
> +		 * If the user enters a PCI device that  doesn't exist
> +		 * like "0000:01:00.1", we don't want strtobool to think
> +		 * it's a '0' when it's clearly not what the user wanted.
> +		 * So we require 0's and 1's to be exactly one character.
> +		 */
> +	} else if (!strtobool(page, use_p2pdma)) {
> +		return 0;
> +	}
> +
> +	pr_err("No such PCI device: %.*s\n", (int)strcspn(page, "\n"), page);
> +	return -ENODEV;
> +}
> +EXPORT_SYMBOL_GPL(pci_p2pdma_enable_store);
> +
> +/**
> + * pci_p2pdma_enable_show - show a configfs/sysfs attribute indicating
> + *		whether p2pdma is enabled
> + * @page: contents of the stored value
> + * @p2p_dev: the selected p2p device (NULL if no device is selected)
> + * @use_p2pdma: whether p2pdme has been enabled
> + *
> + * Attributes that use pci_p2pdma_enable_store() should use this function
> + * to show the value of the attribute.
> + *
> + * Returns 0 on success
> + */
> +ssize_t pci_p2pdma_enable_show(char *page, struct pci_dev *p2p_dev,
> +			       bool use_p2pdma)
> +{
> +	if (!use_p2pdma)
> +		return sprintf(page, "none\n");
> +
> +	if (!p2p_dev)
> +		return sprintf(page, "auto\n");
> +
> +	return sprintf(page, "%s\n", pci_name(p2p_dev));
> +}
> +EXPORT_SYMBOL_GPL(pci_p2pdma_enable_show);
> diff --git a/include/linux/pci-p2pdma.h b/include/linux/pci-p2pdma.h
> index 2f03dbbf5af6..377de4d73767 100644
> --- a/include/linux/pci-p2pdma.h
> +++ b/include/linux/pci-p2pdma.h
> @@ -38,6 +38,10 @@ void pci_p2pmem_free_sgl(struct pci_dev *pdev, struct scatterlist *sgl);
>  void pci_p2pmem_publish(struct pci_dev *pdev, bool publish);
>  int pci_p2pdma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
>  		      enum dma_data_direction dir);
> +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,
> +			       bool use_p2pdma);
>  #else /* CONFIG_PCI_P2PDMA */
>  static inline int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar,
>  		size_t size, u64 offset)
> @@ -105,5 +109,16 @@ static inline int pci_p2pdma_map_sg(struct device *dev,
>  {
>  	return 0;
>  }
> +static inline int pci_p2pdma_enable_store(const char *page,
> +		struct pci_dev **p2p_dev, bool *use_p2pdma)
> +{
> +	*use_p2pdma = false;
> +	return 0;
> +}
> +static inline ssize_t pci_p2pdma_enable_show(char *page,
> +		struct pci_dev *p2p_dev, bool use_p2pdma)
> +{
> +	return sprintf(page, "none\n");
> +}
>  #endif /* CONFIG_PCI_P2PDMA */
>  #endif /* _LINUX_PCI_P2P_H */
> -- 
> 2.19.0
> 
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

  reply	other threads:[~2018-09-21 16:19 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-09-13  0:11 [PATCH v6 00/13] Copy Offload in NVMe Fabrics with P2P PCI Memory Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 01/13] PCI/P2PDMA: Support peer-to-peer memory Logan Gunthorpe
2018-09-20 22:38   ` Bjorn Helgaas
2018-09-20 22:47     ` Logan Gunthorpe
2018-09-21 13:00       ` Bjorn Helgaas
2018-09-21 15:37         ` Logan Gunthorpe
2018-09-21 16:05           ` Christoph Hellwig
2018-09-13  0:11 ` [PATCH v6 02/13] PCI/P2PDMA: Add sysfs group to display p2pmem stats Logan Gunthorpe
2018-09-21 13:07   ` Bjorn Helgaas
2018-09-13  0:11 ` [PATCH v6 03/13] PCI/P2PDMA: Add PCI p2pmem DMA mappings to adjust the bus offset Logan Gunthorpe
2018-09-21 13:15   ` Bjorn Helgaas
2018-09-21 16:48     ` Bjorn Helgaas
2018-09-21 18:13       ` Logan Gunthorpe
2018-09-21 20:00         ` Bjorn Helgaas
2018-09-21 20:01           ` Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 04/13] PCI/P2PDMA: Introduce configfs/sysfs enable attribute helpers Logan Gunthorpe
2018-09-21 16:18   ` Bjorn Helgaas [this message]
2018-09-21 19:44     ` Logan Gunthorpe
2018-09-21 21:12     ` Logan Gunthorpe
2018-09-24 22:39   ` Bjorn Helgaas
2018-09-13  0:11 ` [PATCH v6 05/13] docs-rst: Add a new directory for PCI documentation Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 06/13] PCI/P2PDMA: Add P2P DMA driver writer's documentation Logan Gunthorpe
2018-09-21 16:41   ` Bjorn Helgaas
2018-09-21 18:03     ` Logan Gunthorpe
2018-09-21 19:47       ` Bjorn Helgaas
2018-09-13  0:11 ` [PATCH v6 07/13] block: Add PCI P2P flag for request queue and check support for requests Logan Gunthorpe
2018-09-13  0:28   ` Jens Axboe
2018-09-13 16:14     ` Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 08/13] IB/core: Ensure we map P2P memory correctly in rdma_rw_ctx_[init|destroy]() Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 09/13] nvme-pci: Use PCI p2pmem subsystem to manage the CMB Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 10/13] nvme-pci: Add support for P2P memory in requests Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 11/13] nvme-pci: Add a quirk for a pseudo CMB Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 12/13] nvmet: Introduce helper functions to allocate and free request SGLs Logan Gunthorpe
2018-09-13  0:11 ` [PATCH v6 13/13] nvmet: Optionally use PCI P2P memory Logan Gunthorpe

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=20180921161858.GH224714@bhelgaas-glaptop.roam.corp.google.com \
    --to=helgaas@kernel.org \
    --cc=alex.williamson@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=benh@kernel.crashing.org \
    --cc=bhelgaas@google.com \
    --cc=christian.koenig@amd.com \
    --cc=hch@lst.de \
    --cc=jgg@mellanox.com \
    --cc=jglisse@redhat.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nvdimm@lists.01.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=logang@deltatee.com \
    --cc=maxg@mellanox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: 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).