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
*
next prev parent 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.