Commit 3d41fa33 authored by David S. Miller's avatar David S. Miller

[AIO]: Split ki_user_obj into a 2 member union.

This documents how this member is used in two
ways, 1) as a pointer to a user ioctx and 2)
as a pointer to a task struct to wake up.
parent dd5d5ea8
...@@ -394,7 +394,7 @@ static struct kiocb fastcall *__aio_get_req(struct kioctx *ctx) ...@@ -394,7 +394,7 @@ static struct kiocb fastcall *__aio_get_req(struct kioctx *ctx)
req->ki_ctx = ctx; req->ki_ctx = ctx;
req->ki_cancel = NULL; req->ki_cancel = NULL;
req->ki_retry = NULL; req->ki_retry = NULL;
req->ki_user_obj = NULL; req->ki_obj.user = NULL;
/* Check if the completion queue has enough free space to /* Check if the completion queue has enough free space to
* accept an event from this io. * accept an event from this io.
...@@ -437,7 +437,7 @@ static inline void really_put_req(struct kioctx *ctx, struct kiocb *req) ...@@ -437,7 +437,7 @@ static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)
{ {
req->ki_ctx = NULL; req->ki_ctx = NULL;
req->ki_filp = NULL; req->ki_filp = NULL;
req->ki_user_obj = NULL; req->ki_obj.user = NULL;
kmem_cache_free(kiocb_cachep, req); kmem_cache_free(kiocb_cachep, req);
ctx->reqs_active--; ctx->reqs_active--;
...@@ -605,7 +605,7 @@ void fastcall kick_iocb(struct kiocb *iocb) ...@@ -605,7 +605,7 @@ void fastcall kick_iocb(struct kiocb *iocb)
* single context. */ * single context. */
if (is_sync_kiocb(iocb)) { if (is_sync_kiocb(iocb)) {
kiocbSetKicked(iocb); kiocbSetKicked(iocb);
wake_up_process(iocb->ki_user_obj); wake_up_process(iocb->ki_obj.tsk);
return; return;
} }
...@@ -653,7 +653,7 @@ int fastcall aio_complete(struct kiocb *iocb, long res, long res2) ...@@ -653,7 +653,7 @@ int fastcall aio_complete(struct kiocb *iocb, long res, long res2)
spin_unlock_irq(&ctx->ctx_lock); spin_unlock_irq(&ctx->ctx_lock);
} }
/* sync iocbs put the task here for us */ /* sync iocbs put the task here for us */
wake_up_process(iocb->ki_user_obj); wake_up_process(iocb->ki_obj.tsk);
return ret; return ret;
} }
...@@ -673,13 +673,13 @@ int fastcall aio_complete(struct kiocb *iocb, long res, long res2) ...@@ -673,13 +673,13 @@ int fastcall aio_complete(struct kiocb *iocb, long res, long res2)
event = aio_ring_event(info, tail, KM_IRQ0); event = aio_ring_event(info, tail, KM_IRQ0);
tail = (tail + 1) % info->nr; tail = (tail + 1) % info->nr;
event->obj = (u64)(unsigned long)iocb->ki_user_obj; event->obj = (u64)(unsigned long)iocb->ki_obj.user;
event->data = iocb->ki_user_data; event->data = iocb->ki_user_data;
event->res = res; event->res = res;
event->res2 = res2; event->res2 = res2;
dprintk("aio_complete: %p[%lu]: %p: %p %Lx %lx %lx\n", dprintk("aio_complete: %p[%lu]: %p: %p %Lx %lx %lx\n",
ctx, tail, iocb, iocb->ki_user_obj, iocb->ki_user_data, ctx, tail, iocb, iocb->ki_obj.user, iocb->ki_user_data,
res, res2); res, res2);
/* after flagging the request as done, we /* after flagging the request as done, we
...@@ -1022,7 +1022,7 @@ int fastcall io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, ...@@ -1022,7 +1022,7 @@ int fastcall io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
goto out_put_req; goto out_put_req;
} }
req->ki_user_obj = user_iocb; req->ki_obj.user = user_iocb;
req->ki_user_data = iocb->aio_data; req->ki_user_data = iocb->aio_data;
req->ki_pos = iocb->aio_offset; req->ki_pos = iocb->aio_offset;
...@@ -1148,7 +1148,7 @@ struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb, u32 key ...@@ -1148,7 +1148,7 @@ struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb, u32 key
/* TODO: use a hash or array, this sucks. */ /* TODO: use a hash or array, this sucks. */
list_for_each(pos, &ctx->active_reqs) { list_for_each(pos, &ctx->active_reqs) {
struct kiocb *kiocb = list_kiocb(pos); struct kiocb *kiocb = list_kiocb(pos);
if (kiocb->ki_user_obj == iocb && kiocb->ki_key == key) if (kiocb->ki_obj.user == iocb && kiocb->ki_key == key)
return kiocb; return kiocb;
} }
return NULL; return NULL;
...@@ -1195,7 +1195,7 @@ asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb, ...@@ -1195,7 +1195,7 @@ asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
struct io_event tmp; struct io_event tmp;
pr_debug("calling cancel\n"); pr_debug("calling cancel\n");
memset(&tmp, 0, sizeof(tmp)); memset(&tmp, 0, sizeof(tmp));
tmp.obj = (u64)(unsigned long)kiocb->ki_user_obj; tmp.obj = (u64)(unsigned long)kiocb->ki_obj.user;
tmp.data = kiocb->ki_user_data; tmp.data = kiocb->ki_user_data;
ret = cancel(kiocb, &tmp); ret = cancel(kiocb, &tmp);
if (!ret) { if (!ret) {
......
...@@ -59,7 +59,10 @@ struct kiocb { ...@@ -59,7 +59,10 @@ struct kiocb {
struct list_head ki_list; /* the aio core uses this struct list_head ki_list; /* the aio core uses this
* for cancellation */ * for cancellation */
void __user *ki_user_obj; /* pointer to userland's iocb */ union {
void __user *user;
struct task_struct *tsk;
} ki_obj;
__u64 ki_user_data; /* user's data for completion */ __u64 ki_user_data; /* user's data for completion */
loff_t ki_pos; loff_t ki_pos;
...@@ -76,7 +79,7 @@ struct kiocb { ...@@ -76,7 +79,7 @@ struct kiocb {
(x)->ki_filp = (filp); \ (x)->ki_filp = (filp); \
(x)->ki_ctx = &tsk->active_mm->default_kioctx; \ (x)->ki_ctx = &tsk->active_mm->default_kioctx; \
(x)->ki_cancel = NULL; \ (x)->ki_cancel = NULL; \
(x)->ki_user_obj = tsk; \ (x)->ki_obj.tsk = tsk; \
} while (0) } while (0)
#define AIO_RING_MAGIC 0xa10a10a1 #define AIO_RING_MAGIC 0xa10a10a1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment