Conversion of /proc/sysvipc/* to seq_file
cover Conversion of /proc/sysvipc/* to seq_file
The following two patches convert /proc/sysvipc/* to use seq_file.
This gives us the following:
- Self-consistent IPC records in proc.
- O(n) reading of the files themselves.
Please consider applying. Thanks,
Mike Waychison
PATCH 1/2 Add generic struct ipc_ids seq_file iteration
Add a generic method for ipc types to be displayed using seq_file. This patch abstracts out seq_file iterating over struct ipc_ids into ipc/util.c
util.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ util.h | 8 +++ 2 files changed, 164 insertions(+)
ipc/util.h +8 -0
@@ -30,7 +30,15 @@ struct ipc_ids {struct ipc_id_ary * entries; }; +struct seq_file ;void __init ipc_init_ids (struct ipc_ids * ids,int size); +#ifdef CONFIG_PROC_FS +void __init ipc_init_proc_interface (const char *path,const char *header, +struct ipc_ids *ids, +int (*show)(struct seq_file *,void *)); +#else +#define ipc_init_proc_interface (path, header, ids, show) do {} while (0) +#endif /* must be called with ids->sem acquired.*/ int ipc_findkey (struct ipc_ids * ids,key_t key);
ipc/util.c +156 -0
176 lines not on this page · raw message
PATCH 2/2 Convert /proc/sysvipc/* to generic seq_file interface
In reply to Mike WaychisonThis patch changes the /proc/sysvipc/shm|sem|msg files to use the generic seq_file implementation for struct ipc_ids.
include/linux/msg.h | 1 include/linux/sem.h | 1 ipc/msg.c | 80 +++++++++++++++--------------------------------- ipc/sem.c | 71 +++++++++++++----------------------------- ipc/shm.c | 86 ++++++++++++++++------------------------------------ 5 files changed, 78 insertions(+), 161 deletions(-)
ipc/shm.c +28 -58
@@ -23,12 +23,12 @@#include <linux/init.h> #include <linux/file.h> #include <linux/mman.h> -#include <linux/proc_fs.h> #include <linux/shmem_fs.h> #include <linux/security.h> #include <linux/syscalls.h> #include <linux/audit.h> #include <linux/ptrace.h> +#include <linux/seq_file.h> #include <asm/uaccess.h>
@@ -51,7 +51,7 @@ static int newseg (key_t key, int shmflgstatic void shm_open (struct vm_area_struct *shmd);static void shm_close (struct vm_area_struct *shmd);#ifdef CONFIG_PROC_FS -static int sysvipc_shm_read_proc (char *buffer,char **start,off_t offset,int length,int *eof,void *data); +static int sysvipc_shm_proc_show (struct seq_file *s,void *it);#endif size_t shm_ctlmax =SHMMAX ;
@@ -63,9 +63,10 @@ static int shm_tot; /* total number of svoid __init shm_init (void ) {ipc_init_ids (&shm_ids,1 ); -#ifdef CONFIG_PROC_FS -create_proc_read_entry ("sysvipc/shm" ,0 ,NULL , sysvipc_shm_read_proc,NULL ); -#endif +ipc_init_proc_interface ("sysvipc/shm" , +" key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime\n" , + &shm_ids, + sysvipc_shm_proc_show); }static inline int shm_checkid (struct shmid_kernel *s,int id)
@@ -869,63 +870,32 @@ asmlinkage long sys_shmdt(char __user *s }#ifdef CONFIG_PROC_FS -static int sysvipc_shm_read_proc (char *buffer,char **start,off_t offset,int length,int *eof,void *data) +static int sysvipc_shm_proc_show (struct seq_file *s,void *it) { -off_t pos =0 ; -off_t begin =0 ; -int i, len =0 ; - -down (&shm_ids.sem); - len +=sprintf (buffer," key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime\n" ); +struct shmid_kernel *shp = it; +char *format; -for (i =0 ; i <= shm_ids.max_id; i++) { -struct shmid_kernel * shp; - - shp =shm_lock (i); -if (shp!=NULL ) {#define SMALL_STRING "%10d %10d %4o %10u %5u %5u %5d %5u %5u %5u %5u %10lu %10lu %10lu\n"#define BIG_STRING "%10d %10d %4o %21u %5u %5u %5d %5u %5u %5u %5u %10lu %10lu %10lu\n" -char *format; -if (sizeof (size_t ) <=sizeof (int )) - format =SMALL_STRING ; -else - format =BIG_STRING ; - len +=sprintf (buffer + len, format, - shp->shm_perm.key, -shm_buildid (i, shp->shm_perm.seq), - shp->shm_flags, - shp->shm_segsz, - shp->shm_cprid, - shp->shm_lprid, -is_file_hugepages (shp->shm_file) ? (file_count (shp->shm_file) -1 ) : shp->shm_nattch, - shp->shm_perm.uid, - shp->shm_perm.gid, - shp->shm_perm.cuid, - shp->shm_perm.cgid, - shp->shm_atim, - shp->shm_dtim, - shp->shm_ctim); -shm_unlock (shp); - - pos += len; -if (pos < offset) { - len =0 ; - begin = pos; - } -if (pos > offset + length) - goto done; - } - } - *eof =1 ; -done: -up (&shm_ids.sem); - *start = buffer + (offset - begin); - len -= (offset - begin); -if (len > length) - len = length; -if (len <0 ) - len =0 ; -return len; +if (sizeof (size_t ) <=sizeof (int )) + format =SMALL_STRING ; +else + format =BIG_STRING ; +return seq_printf (s, format, + shp->shm_perm.key, + shp->id, + shp->shm_flags, + shp->shm_segsz, + shp->shm_cprid, + shp->shm_lprid, +is_file_hugepages (shp->shm_file) ? (file_count (shp->shm_file) -1 ) : shp->shm_nattch, + shp->shm_perm.uid, + shp->shm_perm.gid, + shp->shm_perm.cuid, + shp->shm_perm.cgid, + shp->shm_atim, + shp->shm_dtim, + shp->shm_ctim); }#endif
include/linux/sem.h +1 -0
@@ -88,6 +88,7 @@ struct sem {/* One sem_array data structure for each set of semaphores in the system. */ struct sem_array {struct kern_ipc_perm sem_perm;/* permissions .. see ipc.h */ +int sem_id;time_t sem_otime;/* last semop time */ time_t sem_ctime;/* last change time */ struct sem *sem_base;/* ptr to first semaphore in array */
ipc/sem.c +22 -49
108 lines not on this page · raw message
include/linux/msg.h +1 -0
@@ -77,6 +77,7 @@ struct msg_msg {/* one msq_queue structure for each present queue on the system */ struct msg_queue {struct kern_ipc_perm q_perm; +int q_id;time_t q_stime;/* last msgsnd time */ time_t q_rtime;/* last msgrcv time */ time_t q_ctime;/* last change time */
ipc/msg.c +26 -54
116 lines not on this page · raw message