From: Hannes Reinecke <hare@suse.de>
To: Christoph Hellwig <hch@lst.de>, Jens Axboe <axboe@kernel.dk>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Denis Efremov <efremov@linux.com>,
"David S. Miller" <davem@davemloft.net>,
Song Liu <song@kernel.org>, Al Viro <viro@zeniv.linux.org.uk>,
linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-ide@vger.kernel.org, linux-raid@vger.kernel.org,
linux-scsi@vger.kernel.org, linux-m68k@lists.linux-m68k.org
Subject: Re: [PATCH 01/19] char_dev: replace cdev_map with an xarray
Date: Thu, 27 Aug 2020 09:25:07 +0200 [thread overview]
Message-ID: <b2126993-b861-1899-bb42-cb7f461094d4@suse.de> (raw)
In-Reply-To: <20200826062446.31860-2-hch@lst.de>
On 8/26/20 8:24 AM, Christoph Hellwig wrote:
> None of the complicated overlapping regions bits of the kobj_map are
> required for the character device lookup, so just a trivial xarray
> instead.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/char_dev.c | 94 +++++++++++++++++++++++++--------------------------
> fs/dcache.c | 1 -
> fs/internal.h | 5 ---
> 3 files changed, 46 insertions(+), 54 deletions(-)
>
> diff --git a/fs/char_dev.c b/fs/char_dev.c
> index ba0ded7842a779..6c4d6c4938f14b 100644
> --- a/fs/char_dev.c
> +++ b/fs/char_dev.c
> @@ -17,7 +17,6 @@
> #include <linux/seq_file.h>
>
> #include <linux/kobject.h>
> -#include <linux/kobj_map.h>
> #include <linux/cdev.h>
> #include <linux/mutex.h>
> #include <linux/backing-dev.h>
> @@ -25,8 +24,7 @@
>
> #include "internal.h"
>
> -static struct kobj_map *cdev_map;
> -
> +static DEFINE_XARRAY(cdev_map);
> static DEFINE_MUTEX(chrdevs_lock);
>
> #define CHRDEV_MAJOR_HASH_SIZE 255
> @@ -367,6 +365,29 @@ void cdev_put(struct cdev *p)
> }
> }
>
> +static struct cdev *cdev_lookup(dev_t dev)
> +{
> + struct cdev *cdev;
> +
> +retry:
> + mutex_lock(&chrdevs_lock);
> + cdev = xa_load(&cdev_map, dev);
> + if (!cdev) {
> + mutex_unlock(&chrdevs_lock);
> +
> + if (request_module("char-major-%d-%d",
> + MAJOR(dev), MINOR(dev)) > 0)
> + /* Make old-style 2.4 aliases work */
> + request_module("char-major-%d", MAJOR(dev));
> + goto retry;
> + }
> +
> + if (!cdev_get(cdev))
> + cdev = NULL;
> + mutex_unlock(&chrdevs_lock);
> + return cdev;
> +}
> +
> /*
> * Called every time a character special file is opened
> */
> @@ -380,13 +401,10 @@ static int chrdev_open(struct inode *inode, struct file *filp)
> spin_lock(&cdev_lock);
> p = inode->i_cdev;
> if (!p) {
> - struct kobject *kobj;
> - int idx;
> spin_unlock(&cdev_lock);
> - kobj = kobj_lookup(cdev_map, inode->i_rdev, &idx);
> - if (!kobj)
> + new = cdev_lookup(inode->i_rdev);
> + if (!new)
> return -ENXIO;
> - new = container_of(kobj, struct cdev, kobj);
> spin_lock(&cdev_lock);
> /* Check i_cdev again in case somebody beat us to it while
> we dropped the lock. */
> @@ -454,18 +472,6 @@ const struct file_operations def_chr_fops = {
> .llseek = noop_llseek,
> };
>
> -static struct kobject *exact_match(dev_t dev, int *part, void *data)
> -{
> - struct cdev *p = data;
> - return &p->kobj;
> -}
> -
> -static int exact_lock(dev_t dev, void *data)
> -{
> - struct cdev *p = data;
> - return cdev_get(p) ? 0 : -1;
> -}
> -
> /**
> * cdev_add() - add a char device to the system
> * @p: the cdev structure for the device
> @@ -478,7 +484,7 @@ static int exact_lock(dev_t dev, void *data)
> */
> int cdev_add(struct cdev *p, dev_t dev, unsigned count)
> {
> - int error;
> + int error, i;
>
> p->dev = dev;
> p->count = count;
> @@ -486,14 +492,22 @@ int cdev_add(struct cdev *p, dev_t dev, unsigned count)
> if (WARN_ON(dev == WHITEOUT_DEV))
> return -EBUSY;
>
> - error = kobj_map(cdev_map, dev, count, NULL,
> - exact_match, exact_lock, p);
> - if (error)
> - return error;
> + mutex_lock(&chrdevs_lock);
> + for (i = 0; i < count; i++) {
> + error = xa_insert(&cdev_map, dev + i, p, GFP_KERNEL);
> + if (error)
> + goto out_unwind;
> + }
> + mutex_unlock(&chrdevs_lock);
>
> kobject_get(p->kobj.parent);
> -
> return 0;
> +
> +out_unwind:
> + while (--i >= 0)
> + xa_erase(&cdev_map, dev + i);
> + mutex_unlock(&chrdevs_lock);
> + return error;
> }
>
> /**
Do you really need the mutex?
Wouldn't xa_store_range() be better and avoid the mutex?
Cheers,
Hannes
--
Dr. Hannes Reinecke Kernel Storage Architect
hare@suse.de +49 911 74053 688
SUSE Software Solutions Germany GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), GF: Felix Imendörffer
next prev parent reply other threads:[~2020-08-27 7:25 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-26 6:24 simplify gendisk lookup and remove struct block_device aliases Christoph Hellwig
2020-08-26 6:24 ` [PATCH 01/19] char_dev: replace cdev_map with an xarray Christoph Hellwig
2020-08-26 8:19 ` Greg Kroah-Hartman
2020-08-27 8:53 ` Christoph Hellwig
2020-08-27 9:18 ` Greg Kroah-Hartman
2020-08-27 9:39 ` Christoph Hellwig
2020-08-27 7:25 ` Hannes Reinecke [this message]
2020-08-27 8:55 ` Christoph Hellwig
2020-08-26 6:24 ` [PATCH 02/19] block: merge drivers/base/map.c into block/genhd.c Christoph Hellwig
2020-08-26 8:19 ` Greg Kroah-Hartman
2020-08-26 6:24 ` [PATCH 03/19] block: cleanup del_gendisk a bit Christoph Hellwig
2020-08-26 6:24 ` [PATCH 04/19] block: split block_class_lock Christoph Hellwig
2020-08-26 6:24 ` [PATCH 05/19] block: rework requesting modules for unclaimed devices Christoph Hellwig
2020-08-26 6:24 ` [PATCH 06/19] block: add an optional probe callback to major_names Christoph Hellwig
2020-08-26 6:24 ` [PATCH 07/19] ide: remove ide_{,un}register_region Christoph Hellwig
2020-08-27 7:25 ` Hannes Reinecke
2020-08-26 6:24 ` [PATCH 08/19] swim: don't call blk_register_region Christoph Hellwig
2020-08-26 6:24 ` [PATCH 09/19] sd: use __register_blkdev to avoid a modprobe for an unregistered dev_t Christoph Hellwig
2020-08-26 6:24 ` [PATCH 10/19] brd: use __register_blkdev to allocate devices on demand Christoph Hellwig
2020-08-26 6:24 ` [PATCH 11/19] loop: " Christoph Hellwig
2020-08-26 6:24 ` [PATCH 12/19] md: " Christoph Hellwig
2020-08-28 7:08 ` Song Liu
2020-08-26 6:24 ` [PATCH 13/19] ide: switch to __register_blkdev for command set probing Christoph Hellwig
2020-08-26 6:24 ` [PATCH 14/19] floppy: use a separate gendisk for each media format Christoph Hellwig
2020-08-26 6:24 ` [PATCH 15/19] amiflop: use separate gendisks for Amiga vs MS-DOS mode Christoph Hellwig
2020-08-26 6:24 ` [PATCH 16/19] ataflop: use a separate gendisk for each media format Christoph Hellwig
2020-08-26 6:24 ` [PATCH 17/19] z2ram: reindent Christoph Hellwig
2020-08-26 9:12 ` Joe Perches
2020-08-26 9:49 ` John Paul Adrian Glaubitz
2020-08-26 14:51 ` Joe Perches
2020-08-27 23:21 ` Finn Thain
2020-08-28 0:01 ` Joe Perches
2020-08-28 0:57 ` Finn Thain
2020-08-28 1:11 ` Joe Perches
2020-08-28 4:25 ` Christoph Hellwig
2020-08-26 6:24 ` [PATCH 18/19] z2ram: use separate gendisk for the different modes Christoph Hellwig
2020-08-26 6:24 ` [PATCH 19/19] block: switch gendisk lookup to a simple xarray Christoph Hellwig
-- strict thread matches above, loose matches on Subject: below --
2020-08-30 6:24 simplify gendisk lookup and remove struct block_device aliases v2 Christoph Hellwig
2020-08-30 6:24 ` [PATCH 01/19] char_dev: replace cdev_map with an xarray Christoph Hellwig
2020-08-30 7:31 ` Greg Kroah-Hartman
2020-09-03 8:01 simplify gendisk lookup and remove struct block_device aliases v3 Christoph Hellwig
2020-09-03 8:01 ` [PATCH 01/19] char_dev: replace cdev_map with an xarray Christoph Hellwig
2020-09-04 10:16 ` Hannes Reinecke
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=b2126993-b861-1899-bb42-cb7f461094d4@suse.de \
--to=hare@suse.de \
--cc=axboe@kernel.dk \
--cc=davem@davemloft.net \
--cc=efremov@linux.com \
--cc=gregkh@linuxfoundation.org \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-m68k@lists.linux-m68k.org \
--cc=linux-raid@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=rafael@kernel.org \
--cc=song@kernel.org \
--cc=viro@zeniv.linux.org.uk \
/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