diff options
author | Eric Dumazet <dada1@cosmosbay.com> | 2005-10-30 18:02:16 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-30 20:37:19 -0500 |
commit | 2f51201662b28dbf8c15fb7eb972bc51c6cc3fa5 (patch) | |
tree | 96826df796058560bc5dd1f7d8d476c5a741d7bc /include/linux/fs.h | |
parent | 503af334ecf23b9d65d2ff0cc759f3a0bf338290 (diff) |
[PATCH] reduce sizeof(struct file)
Now that RCU applied on 'struct file' seems stable, we can place f_rcuhead
in a memory location that is not anymore used at call_rcu(&f->f_rcuhead,
file_free_rcu) time, to reduce the size of this critical kernel object.
The trick I used is to move f_rcuhead and f_list in an union called f_u
The callers are changed so that f_rcuhead becomes f_u.fu_rcuhead and f_list
becomes f_u.f_list
Signed-off-by: Eric Dumazet <dada1@cosmosbay.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux/fs.h')
-rw-r--r-- | include/linux/fs.h | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/include/linux/fs.h b/include/linux/fs.h index f83d997c5582..6d6226732c93 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -574,7 +574,14 @@ struct file_ra_state { | |||
574 | #define RA_FLAG_INCACHE 0x02 /* file is already in cache */ | 574 | #define RA_FLAG_INCACHE 0x02 /* file is already in cache */ |
575 | 575 | ||
576 | struct file { | 576 | struct file { |
577 | struct list_head f_list; | 577 | /* |
578 | * fu_list becomes invalid after file_free is called and queued via | ||
579 | * fu_rcuhead for RCU freeing | ||
580 | */ | ||
581 | union { | ||
582 | struct list_head fu_list; | ||
583 | struct rcu_head fu_rcuhead; | ||
584 | } f_u; | ||
578 | struct dentry *f_dentry; | 585 | struct dentry *f_dentry; |
579 | struct vfsmount *f_vfsmnt; | 586 | struct vfsmount *f_vfsmnt; |
580 | struct file_operations *f_op; | 587 | struct file_operations *f_op; |
@@ -598,7 +605,6 @@ struct file { | |||
598 | spinlock_t f_ep_lock; | 605 | spinlock_t f_ep_lock; |
599 | #endif /* #ifdef CONFIG_EPOLL */ | 606 | #endif /* #ifdef CONFIG_EPOLL */ |
600 | struct address_space *f_mapping; | 607 | struct address_space *f_mapping; |
601 | struct rcu_head f_rcuhead; | ||
602 | }; | 608 | }; |
603 | extern spinlock_t files_lock; | 609 | extern spinlock_t files_lock; |
604 | #define file_list_lock() spin_lock(&files_lock); | 610 | #define file_list_lock() spin_lock(&files_lock); |