On Tue, Jun 28, 2022 at 4:54 AM Brian Foster bfoster@redhat.com wrote:
On Thu, Jun 23, 2022 at 03:06:06PM -0700, Kalesh Singh wrote:
To be able to account the amount of memory a process is keeping pinned by open file descriptors add a 'size' field to fdinfo output.
dmabufs fds already expose a 'size' field for this reason, remove this and make it a common field for all fds. This allows tracking of other types of memory (e.g. memfd and ashmem in Android).
Signed-off-by: Kalesh Singh kaleshsingh@google.com Reviewed-by: Christian König christian.koenig@amd.com
Changes in v2:
- Add Christian's Reviewed-by
Changes from rfc:
- Split adding 'size' and 'path' into a separate patches, per Christian
- Split fdinfo seq_printf into separate lines, per Christian
- Fix indentation (use tabs) in documentaion, per Randy
Documentation/filesystems/proc.rst | 12 ++++++++++-- drivers/dma-buf/dma-buf.c | 1 - fs/proc/fd.c | 9 +++++---- 3 files changed, 15 insertions(+), 7 deletions(-)
...
diff --git a/fs/proc/fd.c b/fs/proc/fd.c index 913bef0d2a36..464bc3f55759 100644 --- a/fs/proc/fd.c +++ b/fs/proc/fd.c @@ -54,10 +54,11 @@ static int seq_show(struct seq_file *m, void *v) if (ret) return ret;
seq_printf(m, "pos:\t%lli\nflags:\t0%o\nmnt_id:\t%i\nino:\t%lu\n",
(long long)file->f_pos, f_flags,
real_mount(file->f_path.mnt)->mnt_id,
file_inode(file)->i_ino);
seq_printf(m, "pos:\t%lli\n", (long long)file->f_pos);
seq_printf(m, "flags:\t0%o\n", f_flags);
seq_printf(m, "mnt_id:\t%i\n", real_mount(file->f_path.mnt)->mnt_id);
seq_printf(m, "ino:\t%lu\n", file_inode(file)->i_ino);
seq_printf(m, "size:\t%lli\n", (long long)file_inode(file)->i_size);
Hi Kalesh,
Any reason not to use i_size_read() here?
Hi Brian.
Thanks for pointing this out. You are right, we should use i_size_read() here. I'll update in the next version.
Also not sure if it matters that much for your use case, but something worth noting at least with shmem is that one can do something like:
# cat /proc/meminfo | grep Shmem: Shmem: 764 kB # xfs_io -fc "falloc -k 0 10m" ./file # ls -alh file -rw-------. 1 root root 0 Jun 28 07:22 file # stat file File: file Size: 0 Blocks: 20480 IO Block: 4096 regular empty file # cat /proc/meminfo | grep Shmem: Shmem: 11004 kB
... where the resulting memory usage isn't reflected in i_size (but is is in i_blocks/bytes).
I tried a similar experiment a few times, but I don't see the same results. In my case, there is not any change in shmem. IIUC the fallocate is allocating the disk space not shared memory.
cat /proc/meminfo > meminfo.start xfs_io -fc "falloc -k 0 50m" ./xfs_file cat /proc/meminfo > meminfo.stop tail -n +1 meminfo.st* | grep -i '==|Shmem:'
==> meminfo.start <== Shmem: 484 kB ==> meminfo.stop <== Shmem: 484 kB
ls -lh xfs_file -rw------- 1 root root 0 Jun 28 15:12 xfs_file
stat xfs_file File: xfs_file Size: 0 Blocks: 102400 IO Block: 4096 regular empty file
Thanks, Kalesh
Brian
/* show_fd_locks() never deferences files so a stale value is safe */ show_fd_locks(m, file, files);
-- 2.37.0.rc0.161.g10f37bed90-goog