Hi,

I am trying to duplicate the purpose of /proc/pid/io for a homework to understand how procfs / seq_file works. Although there is no mandate to use seq_file but it seems very interesting to me.

The aim is to print an output similar to /proc/pid/io but for all processes at once using a custom proc file name "/proc/proc_io".

The project is organized as follows:
main.c -> It is responsible for kernel module init / deinit
sequence.c -> This is where I have put in the processing logic
utils.h -> bunch of macros for debugging

The debugging logs come as follows:
=========
[  +4.814129] <pl_open:15> 
[  +0.000017] <pl_seq_start:53> 
[  +0.000003] <pl_seq_start:55> init_task: [ffffffff81e11500] pos: [0]
[  +0.000001] <pl_seq_show:103> 
[  +0.000004] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225a28000]
[  +0.000002] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225a28dc0]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225a29b80]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225a2b700]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225a2d280]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225a2e040]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225a2ee00]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225a78000]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225a7ee00]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225aa8000]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225aa8dc0]
[  +0.000001] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225aaa940]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225aab700]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225aac4c0]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225aad280]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225aaee00]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225048000]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff880225048dc0]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff880225049b80]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff88022504b700]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff88022504c4c0]
[  +0.000001] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff88022504d280]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff88022504e040]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff8802250f0000]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff8802250f0dc0]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff8802250f1b80]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff8802250f2940]
[  +0.000001] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff8802250f44c0]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff8802250f5280]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff8802250f6040]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff8802250f6e00]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_next:72> 
[  +0.000001] <pl_seq_next:79> n_tsk: [ffff8802251a0dc0]
[  +0.000002] <pl_seq_show:103> 
[  +0.000002] <pl_seq_next:72> 
[  +0.000002] <pl_seq_next:79> n_tsk: [ffff8802251a1b80]
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_stop:92> 
[  +0.000276] <pl_seq_start:53> 
[  +0.000002] <pl_seq_start:55> init_task: [ffffffff81e11500] pos: [1]
[  +0.000001] <pl_seq_stop:92> 
=========

Towards the end, the sequence is as follows:
[  +0.000001] <pl_seq_show:103> 
[  +0.000003] <pl_seq_stop:92> 

i.e. stop() is called after show().
This is making my output truncated to only first few processes.

Although I always return 0 from show(), I fail to understand why stop() is being invoked just after show().

Can you please help me or redirect me somewhere to understand why this is happening?

Thank You.
Gaurav