* [PATCH RESEND 1/5] aio: Export symbols and struct kiocb_batch for in kernel aio usage
2012-07-13 8:55 [PATCH RESEND 0/5] Add vhost-blk support Asias He
@ 2012-07-13 8:55 ` Asias He
2012-07-13 8:55 ` [PATCH RESEND 2/5] eventfd: Export symbol eventfd_file_create() Asias He
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Asias He @ 2012-07-13 8:55 UTC (permalink / raw)
To: linux-kernel
Cc: Benjamin LaHaise, Alexander Viro, Jeff Moyer, James Bottomley,
Michael S. Tsirkin, linux-aio, linux-fsdevel, kvm, virtualization
This is useful for people who want to use aio in kernel, e.g. vhost-blk.
Cc: Benjamin LaHaise <bcrl@kvack.org>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Jeff Moyer <jmoyer@redhat.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: linux-aio@kvack.org
Cc: linux-fsdevel@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: kvm@vger.kernel.org
Cc: virtualization@lists.linux-foundation.org
Signed-off-by: Asias He <asias@redhat.com>
---
fs/aio.c | 37 ++++++++++++++++++-------------------
include/linux/aio.h | 21 +++++++++++++++++++++
2 files changed, 39 insertions(+), 19 deletions(-)
diff --git a/fs/aio.c b/fs/aio.c
index 55c4c76..93dfbdd 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -224,22 +224,24 @@ static void __put_ioctx(struct kioctx *ctx)
call_rcu(&ctx->rcu_head, ctx_rcu_free);
}
-static inline int try_get_ioctx(struct kioctx *kioctx)
+inline int try_get_ioctx(struct kioctx *kioctx)
{
return atomic_inc_not_zero(&kioctx->users);
}
+EXPORT_SYMBOL(try_get_ioctx);
-static inline void put_ioctx(struct kioctx *kioctx)
+inline void put_ioctx(struct kioctx *kioctx)
{
BUG_ON(atomic_read(&kioctx->users) <= 0);
if (unlikely(atomic_dec_and_test(&kioctx->users)))
__put_ioctx(kioctx);
}
+EXPORT_SYMBOL(put_ioctx);
/* ioctx_alloc
* Allocates and initializes an ioctx. Returns an ERR_PTR if it failed.
*/
-static struct kioctx *ioctx_alloc(unsigned nr_events)
+struct kioctx *ioctx_alloc(unsigned nr_events)
{
struct mm_struct *mm;
struct kioctx *ctx;
@@ -303,6 +305,7 @@ out_freectx:
dprintk("aio: error allocating ioctx %d\n", err);
return ERR_PTR(err);
}
+EXPORT_SYMBOL(ioctx_alloc);
/* kill_ctx
* Cancels all outstanding aio requests on an aio context. Used
@@ -436,23 +439,14 @@ static struct kiocb *__aio_get_req(struct kioctx *ctx)
return req;
}
-/*
- * struct kiocb's are allocated in batches to reduce the number of
- * times the ctx lock is acquired and released.
- */
-#define KIOCB_BATCH_SIZE 32L
-struct kiocb_batch {
- struct list_head head;
- long count; /* number of requests left to allocate */
-};
-
-static void kiocb_batch_init(struct kiocb_batch *batch, long total)
+void kiocb_batch_init(struct kiocb_batch *batch, long total)
{
INIT_LIST_HEAD(&batch->head);
batch->count = total;
}
+EXPORT_SYMBOL(kiocb_batch_init);
-static void kiocb_batch_free(struct kioctx *ctx, struct kiocb_batch *batch)
+void kiocb_batch_free(struct kioctx *ctx, struct kiocb_batch *batch)
{
struct kiocb *req, *n;
@@ -470,6 +464,7 @@ static void kiocb_batch_free(struct kioctx *ctx, struct kiocb_batch *batch)
wake_up_all(&ctx->wait);
spin_unlock_irq(&ctx->ctx_lock);
}
+EXPORT_SYMBOL(kiocb_batch_free);
/*
* Allocate a batch of kiocbs. This avoids taking and dropping the
@@ -540,7 +535,7 @@ out:
return allocated;
}
-static inline struct kiocb *aio_get_req(struct kioctx *ctx,
+inline struct kiocb *aio_get_req(struct kioctx *ctx,
struct kiocb_batch *batch)
{
struct kiocb *req;
@@ -552,6 +547,7 @@ static inline struct kiocb *aio_get_req(struct kioctx *ctx,
list_del(&req->ki_batch);
return req;
}
+EXPORT_SYMBOL(aio_get_req);
static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)
{
@@ -721,7 +717,7 @@ static inline int __queue_kicked_iocb(struct kiocb *iocb)
* simplifies the coding of individual aio operations as
* it avoids various potential races.
*/
-static ssize_t aio_run_iocb(struct kiocb *iocb)
+ssize_t aio_run_iocb(struct kiocb *iocb)
{
struct kioctx *ctx = iocb->ki_ctx;
ssize_t (*retry)(struct kiocb *);
@@ -815,6 +811,7 @@ out:
}
return ret;
}
+EXPORT_SYMBOL(aio_run_iocb);
/*
* __aio_run_iocbs:
@@ -1136,7 +1133,7 @@ static inline void clear_timeout(struct aio_timeout *to)
del_singleshot_timer_sync(&to->timer);
}
-static int read_events(struct kioctx *ctx,
+int read_events(struct kioctx *ctx,
long min_nr, long nr,
struct io_event __user *event,
struct timespec __user *timeout)
@@ -1252,6 +1249,7 @@ out:
destroy_timer_on_stack(&to.timer);
return i ? i : ret;
}
+EXPORT_SYMBOL(read_events);
/* Take an ioctx and remove it from the list of ioctx's. Protects
* against races with itself via ->dead.
@@ -1492,7 +1490,7 @@ static ssize_t aio_setup_single_vector(int type, struct file * file, struct kioc
* Performs the initial checks and aio retry method
* setup for the kiocb at the time of io submission.
*/
-static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
+ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
{
struct file *file = kiocb->ki_filp;
ssize_t ret = 0;
@@ -1570,6 +1568,7 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat)
return 0;
}
+EXPORT_SYMBOL(aio_setup_iocb);
static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
struct iocb *iocb, struct kiocb_batch *batch,
diff --git a/include/linux/aio.h b/include/linux/aio.h
index b1a520e..4731da5 100644
--- a/include/linux/aio.h
+++ b/include/linux/aio.h
@@ -126,6 +126,16 @@ struct kiocb {
struct eventfd_ctx *ki_eventfd;
};
+/*
+ * struct kiocb's are allocated in batches to reduce the number of
+ * times the ctx lock is acquired and released.
+ */
+#define KIOCB_BATCH_SIZE 32L
+struct kiocb_batch {
+ struct list_head head;
+ long count; /* number of requests left to allocate */
+};
+
#define is_sync_kiocb(iocb) ((iocb)->ki_key == KIOCB_SYNC_KEY)
#define init_sync_kiocb(x, filp) \
do { \
@@ -216,6 +226,17 @@ struct mm_struct;
extern void exit_aio(struct mm_struct *mm);
extern long do_io_submit(aio_context_t ctx_id, long nr,
struct iocb __user *__user *iocbpp, bool compat);
+extern struct kioctx *ioctx_alloc(unsigned nr_events);
+extern ssize_t aio_run_iocb(struct kiocb *iocb);
+extern int read_events(struct kioctx *ctx, long min_nr, long nr,
+ struct io_event __user *event,
+ struct timespec __user *timeout);
+extern ssize_t aio_setup_iocb(struct kiocb *kiocb, bool compat);
+extern void kiocb_batch_init(struct kiocb_batch *batch, long total);
+extern void kiocb_batch_free(struct kioctx *ctx, struct kiocb_batch *batch);
+extern struct kiocb *aio_get_req(struct kioctx *ctx, struct kiocb_batch *batch);
+extern int try_get_ioctx(struct kioctx *kioctx);
+extern void put_ioctx(struct kioctx *kioctx);
#else
static inline ssize_t wait_on_sync_kiocb(struct kiocb *iocb) { return 0; }
static inline int aio_put_req(struct kiocb *iocb) { return 0; }
--
1.7.10.4
--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org. For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH RESEND 0/5] Add vhost-blk support
2012-07-13 8:55 [PATCH RESEND 0/5] Add vhost-blk support Asias He
` (2 preceding siblings ...)
2012-07-14 7:49 ` [PATCH RESEND 0/5] Add vhost-blk support Christoph Hellwig
@ 2012-07-17 15:09 ` Michael S. Tsirkin
2012-07-18 2:09 ` Asias He
2012-07-18 11:42 ` Stefan Hajnoczi
2012-07-20 19:30 ` Michael S. Tsirkin
4 siblings, 2 replies; 9+ messages in thread
From: Michael S. Tsirkin @ 2012-07-17 15:09 UTC (permalink / raw)
To: Asias He
Cc: linux-kernel, Alexander Viro, Benjamin LaHaise, James Bottomley,
Jeff Moyer, kvm, linux-aio, linux-fsdevel, target-devel,
linux-scsi, lf-virt, Stefan Hajnoczi, Zhi Yong Wu,
Anthony Liguori, Paolo Bonzini, Christoph Hellwig, Jens Axboe,
Hannes Reinecke
On Fri, Jul 13, 2012 at 04:55:06PM +0800, Asias He wrote:
>
> Hi folks,
>
> [I am resending to fix the broken thread in the previous one.]
>
> This patchset adds vhost-blk support. vhost-blk is a in kernel virito-blk
> device accelerator. Compared to userspace virtio-blk implementation, vhost-blk
> gives about 5% to 15% performance improvement.
Same thing as tcm_host comment:
It seems not 100% clear whether this driver will have major
userspace using it. And if not, it would be very hard to support a
driver when recent userspace does not use it in the end.
I think a good idea for 3.6 would be to make it depend on
CONFIG_STAGING. Then we don't commit to an ABI. For this, you can add
a separate Kconfig and source it from drivers/staging/Kconfig. Maybe it
needs to be in a separate directory drivers/vhost/staging/Kconfig.
I Cc'd the list of tcm_host in the hope that you can cooperate on this.
--
MST
--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org. For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH RESEND 0/5] Add vhost-blk support
2012-07-13 8:55 [PATCH RESEND 0/5] Add vhost-blk support Asias He
` (3 preceding siblings ...)
2012-07-17 15:09 ` Michael S. Tsirkin
@ 2012-07-20 19:30 ` Michael S. Tsirkin
4 siblings, 0 replies; 9+ messages in thread
From: Michael S. Tsirkin @ 2012-07-20 19:30 UTC (permalink / raw)
To: Asias He
Cc: linux-kernel, Alexander Viro, Benjamin LaHaise, James Bottomley,
Jeff Moyer, kvm, linux-aio, linux-fsdevel, virtualization, gregkh
On Fri, Jul 13, 2012 at 04:55:06PM +0800, Asias He wrote:
>
> Hi folks,
>
> [I am resending to fix the broken thread in the previous one.]
>
> This patchset adds vhost-blk support. vhost-blk is a in kernel virito-blk
> device accelerator. Compared to userspace virtio-blk implementation, vhost-blk
> gives about 5% to 15% performance improvement.
>
> Asias He (5):
> aio: Export symbols and struct kiocb_batch for in kernel aio usage
> eventfd: Export symbol eventfd_file_create()
> vhost: Make vhost a separate module
> vhost-net: Use VHOST_NET_FEATURES for vhost-net
> vhost-blk: Add vhost-blk support
OK so given the state it's in, and assuming you think it is helpful
to let it mature in tree and not out of tree, I think it's
reasonable to try to do it like tcm_vhost is going to do it:
- send me changes to vhost core ASAP (and keep it minimal, e.g.
use your own header file to export to userspace)
- for other stuff - put in drivers/staging, and ask Greg to merge
--
MST
--
To unsubscribe, send a message with 'unsubscribe linux-aio' in
the body to majordomo@kvack.org. For more info on Linux AIO,
see: http://www.kvack.org/aio/
Don't email: <a href=mailto:"aart@kvack.org">aart@kvack.org</a>
^ permalink raw reply [flat|nested] 9+ messages in thread