All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Vishal Verma <vishal.l.verma@intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>,
	Dave Jiang <dave.jiang@intel.com>, <linux-kernel@vger.kernel.org>,
	<nvdimm@lists.linux.dev>, <linux-cxl@vger.kernel.org>,
	David Hildenbrand <david@redhat.com>,
	Dave Hansen <dave.hansen@linux.intel.com>,
	Huang Ying <ying.huang@intel.com>,
	Joao Martins <joao.m.martins@oracle.com>
Subject: Re: [PATCH v4 2/3] dax/bus: Introduce guard(device) for device_{lock,unlock} flows
Date: Wed, 13 Dec 2023 17:05:13 +0000	[thread overview]
Message-ID: <20231213170513.000036e8@Huawei.com> (raw)
In-Reply-To: <20231212-vv-dax_abi-v4-2-1351758f0c92@intel.com>

On Tue, 12 Dec 2023 12:08:31 -0700
Vishal Verma <vishal.l.verma@intel.com> wrote:

> Introduce a guard(device) macro to lock a 'struct device', and unlock it
> automatically when going out of scope using Scope Based Resource
> Management semantics. A lot of the sysfs attribute writes in
> drivers/dax/bus.c benefit from a cleanup using these, so change these
> where applicable.
> 
> Cc: Joao Martins <joao.m.martins@oracle.com>
> Suggested-by: Dan Williams <dan.j.williams@intel.com>
> Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Hi Vishal,

I'm a big fan of this cleanup.h stuff so very happen to see this getting used here.
There are added opportunities for cleanup that result.

Note that almost every time I see people using this stuff they don't look again
at the code post the change so miss the wider cleanup that it enables. So you are
in good company ;)

Jonathan

> ---
>  include/linux/device.h |   2 +
>  drivers/dax/bus.c      | 109 +++++++++++++++++++------------------------------
>  2 files changed, 44 insertions(+), 67 deletions(-)
> 
> diff --git a/include/linux/device.h b/include/linux/device.h
> index d7a72a8749ea..a83efd9ae949 100644
> --- a/include/linux/device.h
> +++ b/include/linux/device.h
> @@ -1131,6 +1131,8 @@ void set_secondary_fwnode(struct device *dev, struct fwnode_handle *fwnode);
>  void device_set_of_node_from_dev(struct device *dev, const struct device *dev2);
>  void device_set_node(struct device *dev, struct fwnode_handle *fwnode);
>  
> +DEFINE_GUARD(device, struct device *, device_lock(_T), device_unlock(_T))

Nice. I'd expect this to be widely adopted, so maybe to make things less painful
for backporting changes that depend on it, make this a separate trivial patch
rather than having this in here.

> +
>  static inline int dev_num_vf(struct device *dev)
>  {
>  	if (dev->bus && dev->bus->num_vf)
> diff --git a/drivers/dax/bus.c b/drivers/dax/bus.c
> index 1ff1ab5fa105..ce1356ac6dc2 100644
> --- a/drivers/dax/bus.c
> +++ b/drivers/dax/bus.c
> @@ -296,9 +296,8 @@ static ssize_t available_size_show(struct device *dev,
>  	struct dax_region *dax_region = dev_get_drvdata(dev);
>  	unsigned long long size;
>  
> -	device_lock(dev);
> +	guard(device)(dev);
>  	size = dax_region_avail_size(dax_region);
> -	device_unlock(dev);
>  
>  	return sprintf(buf, "%llu\n", size);
	return sprintf(buf, @%llu\n@, dax_region_avail_size(dax_region));
and drop the local variable that adds little perhaps?

>  }
> @@ -314,10 +313,9 @@ static ssize_t seed_show(struct device *dev,
>  	if (is_static(dax_region))
>  		return -EINVAL;
>  
> -	device_lock(dev);
> +	guard(device)(dev);
>  	seed = dax_region->seed;
>  	rc = sprintf(buf, "%s\n", seed ? dev_name(seed) : "");

return sprintf();

> -	device_unlock(dev);
>  
>  	return rc;
>  }
> @@ -333,10 +331,9 @@ static ssize_t create_show(struct device *dev,
>  	if (is_static(dax_region))
>  		return -EINVAL;
>  
> -	device_lock(dev);
> +	guard(device)(dev);
>  	youngest = dax_region->youngest;
>  	rc = sprintf(buf, "%s\n", youngest ? dev_name(youngest) : "");

return sprintf();

> -	device_unlock(dev);
>  
>  	return rc;
>  }
> @@ -345,7 +342,14 @@ static ssize_t create_store(struct device *dev, struct device_attribute *attr,
>  		const char *buf, size_t len)
>  {
>  	struct dax_region *dax_region = dev_get_drvdata(dev);
> +	struct dev_dax_data data = {
> +		.dax_region = dax_region,
> +		.size = 0,
> +		.id = -1,
> +		.memmap_on_memory = false,
> +	};
>  	unsigned long long avail;
> +	struct dev_dax *dev_dax;
>  	ssize_t rc;
>  	int val;
>  
> @@ -358,38 +362,26 @@ static ssize_t create_store(struct device *dev, struct device_attribute *attr,
>  	if (val != 1)
>  		return -EINVAL;
>  
> -	device_lock(dev);
> +	guard(device)(dev);
>  	avail = dax_region_avail_size(dax_region);
>  	if (avail == 0)
> -		rc = -ENOSPC;
> -	else {
> -		struct dev_dax_data data = {
> -			.dax_region = dax_region,
> -			.size = 0,
> -			.id = -1,
> -			.memmap_on_memory = false,
> -		};
> -		struct dev_dax *dev_dax = devm_create_dev_dax(&data);
> +		return -ENOSPC;
>  
> -		if (IS_ERR(dev_dax))
> -			rc = PTR_ERR(dev_dax);
> -		else {
> -			/*
> -			 * In support of crafting multiple new devices
> -			 * simultaneously multiple seeds can be created,
> -			 * but only the first one that has not been
> -			 * successfully bound is tracked as the region
> -			 * seed.
> -			 */
> -			if (!dax_region->seed)
> -				dax_region->seed = &dev_dax->dev;
> -			dax_region->youngest = &dev_dax->dev;
> -			rc = len;
> -		}
> -	}
> -	device_unlock(dev);
> +	dev_dax = devm_create_dev_dax(&data);
> +	if (IS_ERR(dev_dax))
> +		return PTR_ERR(dev_dax);
>  
> -	return rc;
> +	/*
> +	 * In support of crafting multiple new devices

rewrap this comment for the new indent.

> +	 * simultaneously multiple seeds can be created,
> +	 * but only the first one that has not been
> +	 * successfully bound is tracked as the region
> +	 * seed.
> +	 */
> +	if (!dax_region->seed)
> +		dax_region->seed = &dev_dax->dev;
> +	dax_region->youngest = &dev_dax->dev;

Trivial but blank line here would be a nice to have

> +	return len;
>  }


...

> @@ -1138,18 +1123,14 @@ static ssize_t mapping_store(struct device *dev, struct device_attribute *attr,
>  		return rc;
>  
>  	rc = -ENXIO;

Not needed with suggested changes that follow.

> -	device_lock(dax_region->dev);
> -	if (!dax_region->dev->driver) {
> -		device_unlock(dax_region->dev);
> +	guard(device)(dax_region->dev);
> +	if (!dax_region->dev->driver)
>  		return rc;
		return -ENXIO;
> -	}
> -	device_lock(dev);
>  
> +	guard(device)(dev);
>  	to_alloc = range_len(&r);
>  	if (alloc_is_aligned(dev_dax, to_alloc))
>  		rc = alloc_dev_dax_range(dev_dax, r.start, to_alloc);
Flip logic here and I'd drop the ternary stuff as well - same in other
similar cases in this patch (though that is just personal taste)

	if (!alloc_is_aligned(dev_dax, to_allco))
		return -ENXIO.

	rc = alloc_dev_dax_range(dev_dax, r.start, to_allco)
	if (rc)
		return rc;

	return len;

> -	device_unlock(dev);
> -	device_unlock(dax_region->dev);
>  
>  	return rc == 0 ? len : rc;
>  }

> 


  parent reply	other threads:[~2023-12-13 17:05 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-12 19:08 [PATCH v4 0/3] Add DAX ABI for memmap_on_memory Vishal Verma
2023-12-12 19:08 ` [PATCH v4 1/3] Documentatiion/ABI: Add ABI documentation for sys-bus-dax Vishal Verma
2023-12-13 16:50   ` Jonathan Cameron
2023-12-12 19:08 ` [PATCH v4 2/3] dax/bus: Introduce guard(device) for device_{lock,unlock} flows Vishal Verma
2023-12-12 19:41   ` Ira Weiny
2023-12-13 17:05   ` Jonathan Cameron [this message]
2023-12-12 19:08 ` [PATCH v4 3/3] dax: add a sysfs knob to control memmap_on_memory behavior Vishal Verma
2023-12-13  1:10   ` Huang, Ying

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=20231213170513.000036e8@Huawei.com \
    --to=jonathan.cameron@huawei.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=dave.jiang@intel.com \
    --cc=david@redhat.com \
    --cc=joao.m.martins@oracle.com \
    --cc=linux-cxl@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nvdimm@lists.linux.dev \
    --cc=vishal.l.verma@intel.com \
    --cc=ying.huang@intel.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 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.