diff options
author | Zach Brown <zach.brown@oracle.com> | 2005-11-13 19:07:33 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-13 21:14:16 -0500 |
commit | 20dcae32439384b6863c626bb3b2a09bed65b33e (patch) | |
tree | 9750c39119447fb32963448bf1935e1ba22b2f9d /include/linux | |
parent | 4557398f8cbaf9f254cff747534b4724c7f75c4f (diff) |
[PATCH] aio: remove kioctx from mm_struct
Sync iocbs have a life cycle that don't need a kioctx. Their retrying, if
any, is done in the context of their owner who has allocated them on the
stack.
The sole user of a sync iocb's ctx reference was aio_complete() checking for
an elevated iocb ref count that could never happen. No path which grabs an
iocb ref has access to sync iocbs.
If we were to implement sync iocb cancelation it would be done by the owner of
the iocb using its on-stack reference.
Removing this chunk from aio_complete allows us to remove the entire kioctx
instance from mm_struct, reducing its size by a third. On a i386 testing box
the slab size went from 768 to 504 bytes and from 5 to 8 per page.
Signed-off-by: Zach Brown <zach.brown@oracle.com>
Acked-by: Benjamin LaHaise <bcrl@kvack.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/aio.h | 2 | ||||
-rw-r--r-- | include/linux/init_task.h | 1 | ||||
-rw-r--r-- | include/linux/sched.h | 1 |
3 files changed, 1 insertions, 3 deletions
diff --git a/include/linux/aio.h b/include/linux/aio.h index 403d71dcb7c8..9e0ae8711276 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h | |||
@@ -124,7 +124,7 @@ struct kiocb { | |||
124 | (x)->ki_users = 1; \ | 124 | (x)->ki_users = 1; \ |
125 | (x)->ki_key = KIOCB_SYNC_KEY; \ | 125 | (x)->ki_key = KIOCB_SYNC_KEY; \ |
126 | (x)->ki_filp = (filp); \ | 126 | (x)->ki_filp = (filp); \ |
127 | (x)->ki_ctx = &tsk->active_mm->default_kioctx; \ | 127 | (x)->ki_ctx = NULL; \ |
128 | (x)->ki_cancel = NULL; \ | 128 | (x)->ki_cancel = NULL; \ |
129 | (x)->ki_dtor = NULL; \ | 129 | (x)->ki_dtor = NULL; \ |
130 | (x)->ki_obj.tsk = tsk; \ | 130 | (x)->ki_obj.tsk = tsk; \ |
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 68ab5f2ab9cd..dcfd2ecccb5d 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
@@ -51,7 +51,6 @@ | |||
51 | .page_table_lock = SPIN_LOCK_UNLOCKED, \ | 51 | .page_table_lock = SPIN_LOCK_UNLOCKED, \ |
52 | .mmlist = LIST_HEAD_INIT(name.mmlist), \ | 52 | .mmlist = LIST_HEAD_INIT(name.mmlist), \ |
53 | .cpu_vm_mask = CPU_MASK_ALL, \ | 53 | .cpu_vm_mask = CPU_MASK_ALL, \ |
54 | .default_kioctx = INIT_KIOCTX(name.default_kioctx, name), \ | ||
55 | } | 54 | } |
56 | 55 | ||
57 | #define INIT_SIGNALS(sig) { \ | 56 | #define INIT_SIGNALS(sig) { \ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 41df81395719..2038bd27b041 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -357,7 +357,6 @@ struct mm_struct { | |||
357 | /* aio bits */ | 357 | /* aio bits */ |
358 | rwlock_t ioctx_list_lock; | 358 | rwlock_t ioctx_list_lock; |
359 | struct kioctx *ioctx_list; | 359 | struct kioctx *ioctx_list; |
360 | struct kioctx default_kioctx; | ||
361 | }; | 360 | }; |
362 | 361 | ||
363 | struct sighand_struct { | 362 | struct sighand_struct { |