Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp897imm; Fri, 21 Sep 2018 09:19:35 -0700 (PDT) X-Google-Smtp-Source: ACcGV62V8X9vv6C0ADyYe0/HVzpvQHRuLjNr03Mcy0m9Ob+OhSvDQxHUJyOmz0iaa2jEiM9Bpda4 X-Received: by 2002:a63:4d5b:: with SMTP id n27-v6mr344921pgl.270.1537546775776; Fri, 21 Sep 2018 09:19:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537546775; cv=none; d=google.com; s=arc-20160816; b=wYDtPWd7aasYM+6+txUhnkhzF1YPparYfriIiOz9MqwXDWQI+OeH9Vo+7SiDECDelA 8SwcHaI/f6rW+vdhk7BXbt+1c+m8hPX7OeDi+q9BrHfR7RxefLDjZj4aJTG8d75H/74H d9yUF9dCphbeiYwu9ALk3798Jpn9YaAwaulom2AfRbZk6LKFhudzhkFAp42hoDyfuNWc Ga/h05ZThbWqMEUrRxS5pTUwg2aOjiThFnjLYfW6qfO8iEgG1Kob6VK7ZY24rS3L59fC Kw88hGB3sbijLL04VY93VBZ8lX9OVX5N9J4t9TspeQERxKjYpq04J2Jgn5+8RnxPS9Y6 JxXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=K7Zd/LJN8JYcrr0nfnhUIBXc5JByCjleZxyA9edVMts=; b=dIWBj/Y6kefx94elXwdimnOSVvMfkOOAbT5JA8MiVEmL1BlTrm9CJyp6c1xl4xGRg/ WfkWg4Mdw1raLbdL4ip5Q7xpvG87A2TeIIEZx56zlhWVwZP8EJcdb5MWGHzOar8vNQ97 +UHFf30YCLmAxiG5+riq08vpdTx+IF4EpX6/8X10cEl0o77y7LSmW5fRx3vuAO2sf8mt Q0WCT+2o9wd7yBB6Le+qWVTZPH++g+FNbg4hM8K2OomcmgESabtxWGJBaMOlViSQuMLk 4pf0LvdkznaC7WAMRyg2GxPLMkzqBuU5/C5MeV4ING5/itAv+tPrWeEffxzxbj2y0Ci4 ZELw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fiFTXajG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l5-v6si26802135pff.304.2018.09.21.09.19.19; Fri, 21 Sep 2018 09:19:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=fiFTXajG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390705AbeIUWIl (ORCPT + 99 others); Fri, 21 Sep 2018 18:08:41 -0400 Received: from mail.kernel.org ([198.145.29.99]:60080 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728221AbeIUWIl (ORCPT ); Fri, 21 Sep 2018 18:08:41 -0400 Received: from localhost (unknown [150.199.191.185]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 1FFAA21550; Fri, 21 Sep 2018 16:19:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1537546745; bh=rmuL3ipH4J1YEgEOUFO5mHBBwkTmkIFd94u591nDNCo=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=fiFTXajGYkHgZbrzjqLKjg9cxO+N4ViMZswUGrdBxxA5ks8qm58vsLGRnD8T3nt1m 1rQAdbNF9+imjwRygHG8p1OorCf7ReW/BRASmvw/m3aNaF8ZkBIjPZss6CVJGAqyzX rbHHiX/M6ykPOLbLakThzxrYomUTAy7HA2EF5nr4= Date: Fri, 21 Sep 2018 11:18:58 -0500 From: Bjorn Helgaas To: Logan Gunthorpe Cc: linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, linux-nvme@lists.infradead.org, linux-rdma@vger.kernel.org, linux-nvdimm@lists.01.org, linux-block@vger.kernel.org, Stephen Bates , Christoph Hellwig , Keith Busch , Sagi Grimberg , Bjorn Helgaas , Jason Gunthorpe , Max Gurtovoy , Dan Williams , =?iso-8859-1?B?Suly9G1l?= Glisse , Benjamin Herrenschmidt , Alex Williamson , Christian =?iso-8859-1?Q?K=F6nig?= , Jens Axboe Subject: Re: [PATCH v6 04/13] PCI/P2PDMA: Introduce configfs/sysfs enable attribute helpers Message-ID: <20180921161858.GH224714@bhelgaas-glaptop.roam.corp.google.com> References: <20180913001156.4115-1-logang@deltatee.com> <20180913001156.4115-5-logang@deltatee.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180913001156.4115-5-logang@deltatee.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 > --- > 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 > #include > #include > #include > @@ -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 >