All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rusty Russell <rusty@rustcorp.com.au>
To: Mark Wu <dwu@redhat.com>
Cc: Tejun Heo <tj@kernel.org>, "Michael S. Tsirkin" <mst@redhat.com>,
	virtualization@lists.linux-foundation.org, kvm@vger.kernel.org,
	linux-kernel@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
	Greg Kroah-Hartman <gregkh@suse.de>
Subject: Re: [PATCH 1/1] [virt] virtio-blk: Use ida to allocate disk index
Date: Wed, 15 Jun 2011 14:21:51 +0930	[thread overview]
Message-ID: <87mxhjzogo.fsf@rustcorp.com.au> (raw)
In-Reply-To: <4DF0A374.6090504@redhat.com>

> Since virtio blk driver doesn't use async probe, it needn't use spinlock to protect ida.
> So remove the lock from patch.

OK, that's fine, but:
> -	if (index_to_minor(index) >= 1 << MINORBITS)
> -		return -ENOSPC;
> +	do {
> +		if (!ida_pre_get(&vd_index_ida, GFP_KERNEL))
> +			return -ENOMEM;
> +		err = ida_get_new(&vd_index_ida, &index);
> +	} while (err == -EAGAIN);
> +
> +	if (err)
> +		return err;
> +
> +	if (index_to_minor(index) >= 1 << MINORBITS) {
> +		err =  -ENOSPC;
> +		goto out_free_index;
> +	}

Is this *really* how this is supposed to be used?

Tejun, this is your code.  What do you think of something like this?
(untested)

Subject: ida: Simplified functions for id allocation.

The current hyper-optimized functions are overkill if you simply want
to allocate an id for a device.  Create versions which use an internal
lock.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

diff --git a/include/linux/idr.h b/include/linux/idr.h
--- a/include/linux/idr.h
+++ b/include/linux/idr.h
@@ -146,6 +146,9 @@ void ida_remove(struct ida *ida, int id)
 void ida_destroy(struct ida *ida);
 void ida_init(struct ida *ida);
 
+int ida_simple_get(struct ida *ida, int min_id, int max_id);
+void ida_simple_remove(struct ida *ida, int id);
+
 void __init idr_init_cache(void);
 
 #endif /* __IDR_H__ */
diff --git a/lib/idr.c b/lib/idr.c
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -34,8 +34,10 @@
 #include <linux/err.h>
 #include <linux/string.h>
 #include <linux/idr.h>
+#include <linux/mutex.h>
 
 static struct kmem_cache *idr_layer_cache;
+static DEFINE_MUTEX(simple_ida);
 
 static struct idr_layer *get_from_free_list(struct idr *idp)
 {
@@ -926,6 +928,52 @@ void ida_destroy(struct ida *ida)
 EXPORT_SYMBOL(ida_destroy);
 
 /**
+ * ida_simple_get - get a new id.
+ * @ida: the (initialized) ida.
+ * @min_id: the minimum id (inclusive)
+ * @max_id: the maximum id (inclusive)
+ *
+ * Allocates an id in the range min_id <= id <= max_id, or returns -ENOSPC.
+ * On allocation failure, returns -ENOMEM.  This function can sleep.
+ *
+ * Use ida_simple_remove() to get rid of an id.
+ */
+int ida_simple_get(struct ida *ida, int min_id, int max_id)
+{
+	int ret;
+
+	mutex_lock(&simple_ida);
+	if (ida_pre_get(ida, GFP_KERNEL)) {
+		int id;
+		ret = ida_get_new_above(ida, min_id, &id);
+		if (!ret) {
+			if (id > max_id) {
+				ida_remove(ida, id);
+				ret = -ENOSPC;
+			} else
+				ret = id;
+		}
+	} else
+		ret = -ENOMEM;
+	mutex_unlock(&simple_ida);
+	return ret;
+}
+EXPORT_SYMBOL(ida_simple_get);
+
+/**
+ * ida_simple_remove - remove an allocated id.
+ * @ida: the (initialized) ida.
+ * @id: the id returned by ida_simple_get.
+ */
+void ida_simple_remove(struct ida *ida, int id)
+{
+	mutex_lock(&simple_ida);
+	ida_remove(ida, id);
+	mutex_unlock(&simple_ida);
+}
+EXPORT_SYMBOL(ida_simple_remove);
+
+/**
  * ida_init - initialize ida handle
  * @ida:	ida handle
  *



  reply	other threads:[~2011-06-15  5:38 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-01  7:24 [PATCH 1/1] [virt] virtio-blk: Use ida to allocate disk index Mark Wu
2011-06-01  8:25 ` Mark Wu
2011-06-01  8:25 ` Mark Wu
2011-06-02 10:34   ` Michael S. Tsirkin
2011-06-02 10:34   ` Michael S. Tsirkin
2011-06-08 13:12     ` Mark Wu
2011-06-08 13:12     ` Mark Wu
2011-06-01 23:57 ` Rusty Russell
2011-06-01 23:57 ` Rusty Russell
2011-06-08 13:08   ` Mark Wu
2011-06-08 23:21     ` Rusty Russell
2011-06-08 23:21     ` Rusty Russell
2011-06-08 23:45       ` Greg KH
2011-06-08 23:45       ` Greg KH
2011-06-09  9:14       ` Tejun Heo
2011-06-09 10:41         ` Mark Wu
2011-06-15  4:51           ` Rusty Russell [this message]
2011-06-15  7:06             ` Tejun Heo
2011-06-16  0:05               ` Rusty Russell
2011-06-16  0:05               ` Rusty Russell
2011-06-16  7:46                 ` Tejun Heo
2011-06-16  7:46                 ` Tejun Heo
2011-06-15  7:06             ` Tejun Heo
2011-06-15  4:51           ` Rusty Russell
2011-10-19 10:12           ` Michael S. Tsirkin
2011-10-24 10:02             ` Michael S. Tsirkin
2011-10-24 10:02               ` Jens Axboe
2011-10-25  1:07                 ` Rusty Russell
2011-06-09 10:41         ` Mark Wu
2011-06-09  9:14       ` Tejun Heo
2011-06-08 13:08   ` Mark Wu
2011-06-02 10:33 ` Michael S. Tsirkin
2011-06-02 10:33 ` Michael S. Tsirkin
  -- strict thread matches above, loose matches on Subject: below --
2011-06-01  7:24 Mark Wu

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=87mxhjzogo.fsf@rustcorp.com.au \
    --to=rusty@rustcorp.com.au \
    --cc=axboe@kernel.dk \
    --cc=dwu@redhat.com \
    --cc=gregkh@suse.de \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=tj@kernel.org \
    --cc=virtualization@lists.linux-foundation.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.