fs/file: more unsigned file descriptors
Subsystems (3)
PATCH 1/2 fs/file: more unsigned file descriptors
Propagate unsignedness for grand total of 149 bytes:
$ ./scripts/bloat-o-meter ../vmlinux-000 ../obj/vmlinux add/remove: 0/0 grow/shrink: 0/10 up/down: 0/-149 (-149) function old new delta set_close_on_exec 99 98 -1 put_files_struct 201 200 -1 get_close_on_exec 59 58 -1 do_prlimit 498 497 -1 do_execveat_common.isra 1662 1661 -1 __close_fd 178 173 -5 do_dup2 219 204 -15 seq_show 685 660 -25 __alloc_fd 384 357 -27 dup_fd 718 646 -72
It mostly comes from converting "unsigned int" to "long" for bit operations.
Signed-off-by Alexey Dobriyan <[email protected]>
---
fs/file.c | 34 +++++++++++++++++----------------- include/linux/fdtable.h | 6 +++--- include/linux/fs.h | 2 +- kernel/sysctl.c | 4 ++-- 4 files changed, 23 insertions(+), 23 deletions(-)
fs/file.c +17 -17
@@ -23,12 +23,12 @@#include <linux/rcupdate.h> #include <linux/workqueue.h> -int sysctl_nr_open__read_mostly =1024 *1024 ; -int sysctl_nr_open_min =BITS_PER_LONG ; +unsigned int sysctl_nr_open__read_mostly =1024 *1024 ; +unsigned int sysctl_nr_open_min =BITS_PER_LONG ;/* our min() is unusable in constant expressions ;-/ */ #define __const_min (x, y) ((x) < (y) ? (x) : (y)) -int sysctl_nr_open_max =__const_min (INT_MAX , ~(size_t )0 /sizeof (void *)) & - -BITS_PER_LONG ; +unsigned int sysctl_nr_open_max = +__const_min (INT_MAX , ~(size_t )0 /sizeof (void *)) & -BITS_PER_LONG ;static void *alloc_fdmem (size_t size) {
@@ -163,7 +163,7 @@ out:* Return <0 error code on error; 1 on successful completion. * The files->file_lock should be held on entry, and will be held on exit. */ -static int expand_fdtable (struct files_struct *files,int nr) +static int expand_fdtable (struct files_struct *files,unsigned int nr) __releases(files->file_lock) __acquires(files->file_lock) {
@@ -208,7 +208,7 @@ static int expand_fdtable(struct files_struct *files, int nr)* expanded and execution may have blocked. * The files->file_lock should be held on entry, and will be held on exit. */ -static int expand_files (struct files_struct *files,int nr) +static int expand_files (struct files_struct *files,unsigned int nr) __releases(files->file_lock) __acquires(files->file_lock) {
@@ -243,12 +243,12 @@ repeat:return expanded; } -static inline void __set_close_on_exec (int fd,struct fdtable *fdt) +static inline void __set_close_on_exec (unsigned int fd,struct fdtable *fdt) {__set_bit (fd, fdt->close_on_exec); } -static inline void __clear_close_on_exec (int fd,struct fdtable *fdt) +static inline void __clear_close_on_exec (unsigned int fd,struct fdtable *fdt) {if (test_bit (fd, fdt->close_on_exec))__clear_bit (fd, fdt->close_on_exec);
@@ -268,10 +268,10 @@ static inline void __clear_open_fd(unsigned int fd, struct fdtable *fdt)__clear_bit (fd /BITS_PER_LONG , fdt->full_fds_bits); } -static int count_open_files (struct fdtable *fdt) +static unsigned int count_open_files (struct fdtable *fdt) { -int size = fdt->max_fds; -int i; +unsigned int size = fdt->max_fds; +unsigned int i;/* Find the last open fd */ for (i = size /BITS_PER_LONG ; i >0 ; ) {
@@ -291,7 +291,7 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp) {struct files_struct *newf;struct file **old_fds, **new_fds; -int open_files, i; +unsigned int open_files, i;struct fdtable *old_fdt, *new_fdt; *errorp = -ENOMEM ;
@@ -391,7 +391,7 @@ static struct fdtable *close_files(struct files_struct * files)* files structure. */ struct fdtable *fdt =rcu_dereference_raw (files->fdt); -int i, j =0 ; +unsigned int i, j =0 ;for (;;) {unsigned long set;
@@ -477,11 +477,11 @@ struct files_struct init_files = { .file_lock = __SPIN_LOCK_UNLOCKED(init_files.file_lock), }; -static unsigned long find_next_fd (struct fdtable *fdt,unsigned long start) +static unsigned int find_next_fd (struct fdtable *fdt,unsigned int start) { -unsigned long maxfd = fdt->max_fds; -unsigned long maxbit = maxfd /BITS_PER_LONG ; -unsigned long bitbit = start /BITS_PER_LONG ; +unsigned int maxfd = fdt->max_fds; +unsigned int maxbit = maxfd /BITS_PER_LONG ; +unsigned int bitbit = start /BITS_PER_LONG ; bitbit =find_next_zero_bit (fdt->full_fds_bits, maxbit, bitbit) *BITS_PER_LONG ;if (bitbit > maxfd)
include/linux/fdtable.h +3 -3
@@ -30,12 +30,12 @@ struct fdtable {struct rcu_head rcu; }; -static inline bool close_on_exec (int fd,const struct fdtable *fdt) +static inline bool close_on_exec (unsigned int fd,const struct fdtable *fdt) {return test_bit (fd, fdt->close_on_exec); } -static inline bool fd_is_open (int fd,const struct fdtable *fdt) +static inline bool fd_is_open (unsigned int fd,const struct fdtable *fdt) {return test_bit (fd, fdt->open_fds); }
@@ -57,7 +57,7 @@ struct files_struct {* written part on a separate cache line in SMP */ spinlock_t file_lock____cacheline_aligned_in_smp ; -int next_fd; +unsigned int next_fd;unsigned long close_on_exec_init[1 ];unsigned long open_fds_init[1 ];unsigned long full_fds_bits_init[1 ];
include/linux/fs.h +1 -1
@@ -63,7 +63,7 @@ extern void __init files_maxfiles_init(void);extern struct files_stat_struct files_stat;extern unsigned long get_max_files (void ); -extern int sysctl_nr_open; +extern unsigned int sysctl_nr_open;extern struct inodes_stat_t inodes_stat;extern int leases_enable, lease_break_time;extern int sysctl_protected_symlinks;
kernel/sysctl.c +2 -2
@@ -108,7 +108,7 @@ extern int pid_max_min, pid_max_max;extern int percpu_pagelist_fraction;extern int compat_log;extern int latencytop_enabled; -extern int sysctl_nr_open_min, sysctl_nr_open_max; +extern unsigned int sysctl_nr_open_min, sysctl_nr_open_max;#ifndef CONFIG_MMU extern int sysctl_nr_trim_pages;#endif
@@ -1692,7 +1692,7 @@ static struct ctl_table fs_table[] = { { .procname = "nr_open", .data = &sysctl_nr_open, - .maxlen = sizeof(int), + .maxlen = sizeof(unsigned int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = &sysctl_nr_open_min,
PATCH 2/2 proc: unsigned file descriptors
Make struct proc_inode::fd unsigned.
This allows better code generation on x86_64 (less sign extensions).
Signed-off-by Alexey Dobriyan <[email protected]>
---
fs/proc/fd.c | 8 ++++---- fs/proc/fd.h | 2 +- fs/proc/internal.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-)
fs/proc/fd.c +4 -4
@@ -31,7 +31,7 @@ static int seq_show(struct seq_file *m, void *v)put_task_struct (task);if (files) { -int fd =proc_fd (m->private); +unsigned int fd =proc_fd (m->private);spin_lock (&files->file_lock); file =fcheck_files (files, fd);
@@ -86,7 +86,7 @@ static int tid_fd_revalidate(struct dentry *dentry, unsigned int flags)struct task_struct *task;const struct cred *cred;struct inode *inode; -int fd; +unsigned int fd;if (flags &LOOKUP_RCU )return -ECHILD ;
@@ -158,7 +158,7 @@ static int proc_fd_link(struct dentry *dentry, struct path *path) }if (files) { -int fd =proc_fd (d_inode (dentry)); +unsigned int fd =proc_fd (d_inode (dentry));struct file *fd_file;spin_lock (&files->file_lock);
@@ -253,7 +253,7 @@ static int proc_readfd_common(struct file *file, struct dir_context *ctx,continue ;rcu_read_unlock (); - len =snprintf (name,sizeof (name),"%d" , fd); + len =snprintf (name,sizeof (name),"%u" , fd);if (!proc_fill_cache (file, ctx, name, len, instantiate, p, (void *)(unsigned long )fd))
fs/proc/fd.h +1 -1
@@ -11,7 +11,7 @@ extern const struct inode_operations proc_fdinfo_inode_operations;extern int proc_fd_permission (struct inode *inode,int mask); -static inline int proc_fd (struct inode *inode) +static inline unsigned int proc_fd (struct inode *inode) {return PROC_I (inode)->fd; }
fs/proc/internal.h +1 -1
@@ -60,7 +60,7 @@ union proc_op {struct proc_inode {struct pid *pid; -int fd; +unsigned int fd;union proc_op op;struct proc_dir_entry *pde;struct ctl_table_header *sysctl;