proc: use %u for pid printing and slightly less stack
PATCH 1/1 proc: use %u for pid printing and slightly less stack
PROC_NUMBUF is 13 which is enough for "negative int + \n + \0".
However PIDs and TGIDs are never negative and newline is not a concern, so use just 10 per integer.
Signed-off-by Alexey Dobriyan <[email protected]>
---
fs/proc/base.c | 16 ++++++++-------- fs/proc/fd.c | 2 +- fs/proc/self.c | 6 +++--- fs/proc/thread_self.c | 5 ++--- 4 files changed, 14 insertions(+), 15 deletions(-)
fs/proc/base.c +8 -8
@@ -3019,11 +3019,11 @@ static const struct inode_operations proc_tgid_base_inode_operations = {static void proc_flush_task_mnt (struct vfsmount *mnt,pid_t pid,pid_t tgid) {struct dentry *dentry, *leader, *dir; -char buf[PROC_NUMBUF ]; +char buf[10 +1 ];struct qstr name; name.name = buf; - name.len =snprintf (buf,sizeof (buf),"%d" , pid); + name.len =snprintf (buf,sizeof (buf),"%u" , pid);/* no ->d_hash() rejects on procfs */ dentry =d_hash_and_lookup (mnt->mnt_root, &name);if (dentry) {
@@ -3035,7 +3035,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid)return ; name.name = buf; - name.len =snprintf (buf,sizeof (buf),"%d" , tgid); + name.len =snprintf (buf,sizeof (buf),"%u" , tgid); leader =d_hash_and_lookup (mnt->mnt_root, &name);if (!leader) goto out;
@@ -3047,7 +3047,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid) goto out_put_leader; name.name = buf; - name.len =snprintf (buf,sizeof (buf),"%d" , pid); + name.len =snprintf (buf,sizeof (buf),"%u" , pid); dentry =d_hash_and_lookup (dir, &name);if (dentry) {d_invalidate (dentry);
@@ -3226,14 +3226,14 @@ int proc_pid_readdir(struct file *file, struct dir_context *ctx)for (iter =next_tgid (ns, iter); iter.task; iter.tgid +=1 , iter =next_tgid (ns, iter)) { -char name[PROC_NUMBUF ]; +char name[10 +1 ];int len;cond_resched ();if (!has_pid_permissions (ns, iter.task,HIDEPID_INVISIBLE ))continue ; - len =snprintf (name,sizeof (name),"%d" , iter.tgid); + len =snprintf (name,sizeof (name),"%u" , iter.tgid); ctx->pos = iter.tgid +TGID_OFFSET ;if (!proc_fill_cache (file, ctx, name, len, proc_pid_instantiate, iter.task,NULL )) {
@@ -3561,10 +3561,10 @@ static int proc_task_readdir(struct file *file, struct dir_context *ctx)for (task =first_tid (proc_pid (inode), tid, ctx->pos -2 , ns); task; task =next_tid (task), ctx->pos++) { -char name[PROC_NUMBUF ]; +char name[10 +1 ];int len; tid =task_pid_nr_ns (task, ns); - len =snprintf (name,sizeof (name),"%d" , tid); + len =snprintf (name,sizeof (name),"%u" , tid);if (!proc_fill_cache (file, ctx, name, len, proc_task_instantiate, task,NULL )) {/* returning this tgid failed, save it as the first
fs/proc/fd.c +1 -1
@@ -236,7 +236,7 @@ static int proc_readfd_common(struct file *file, struct dir_context *ctx,for (fd = ctx->pos -2 ; fd <files_fdtable (files)->max_fds; fd++, ctx->pos++) { -char name[PROC_NUMBUF ]; +char name[10 +1 ];int len;if (!fcheck_files (files, fd))
fs/proc/self.c +3 -3
@@ -17,11 +17,11 @@ static const char *proc_self_get_link(struct dentry *dentry,if (!tgid)return ERR_PTR (-ENOENT ); -/* 11 for max length of signed int in decimal + NULL term */ - name =kmalloc (12 , dentry ?GFP_KERNEL :GFP_ATOMIC ); +/* max length of unsigned int in decimal + NULL term */ + name =kmalloc (10 +1 , dentry ?GFP_KERNEL :GFP_ATOMIC );if (unlikely (!name))return dentry ?ERR_PTR (-ENOMEM ) :ERR_PTR (-ECHILD ); -sprintf (name,"%d" , tgid); +sprintf (name,"%u" , tgid);set_delayed_call (done, kfree_link, name);return name; }
fs/proc/thread_self.c +2 -3
@@ -18,11 +18,10 @@ static const char *proc_thread_self_get_link(struct dentry *dentry,if (!pid)return ERR_PTR (-ENOENT ); - name =kmalloc (PROC_NUMBUF +6 +PROC_NUMBUF , - dentry ?GFP_KERNEL :GFP_ATOMIC ); + name =kmalloc (10 +6 +10 +1 , dentry ?GFP_KERNEL :GFP_ATOMIC );if (unlikely (!name))return dentry ?ERR_PTR (-ENOMEM ) :ERR_PTR (-ECHILD ); -sprintf (name,"%d/task/%d" , tgid, pid); +sprintf (name,"%u/task/%u" , tgid, pid);set_delayed_call (done, kfree_link, name);return name; }