]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Wrap linux specific cachestat syscall
authorMartin Cermak <mcermak@redhat.com>
Thu, 15 May 2025 10:03:55 +0000 (12:03 +0200)
committerMark Wielaard <mark@klomp.org>
Thu, 15 May 2025 19:02:16 +0000 (21:02 +0200)
cachestat takes an fd, cstat_range and flags arguments and
writes out page cache statistics via the cstat struct.

Declare a sys_cachestat wrapper in priv_syswrap-linux.h and hook it
for {amd64,arm,arm64,mips64,nanomips,ppc32,ppc64,riscv64,s390x,x86}-linux
using LINXY with PRE/POST handlers in syswrap-linux.c.

Define __NR_cachestat for amd64, arm, arm64, mips32, mips64, nanomips,
ppc32, ppc64, riscv64, s390x, and x86.

https://bugs.kde.org/show_bug.cgi?id=501741

16 files changed:
NEWS
coregrind/m_syswrap/priv_syswrap-linux.h
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-arm-linux.c
coregrind/m_syswrap/syswrap-arm64-linux.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-mips32-linux.c
coregrind/m_syswrap/syswrap-mips64-linux.c
coregrind/m_syswrap/syswrap-nanomips-linux.c
coregrind/m_syswrap/syswrap-ppc32-linux.c
coregrind/m_syswrap/syswrap-ppc64-linux.c
coregrind/m_syswrap/syswrap-riscv64-linux.c
coregrind/m_syswrap/syswrap-s390x-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c
include/vki/vki-linux.h
include/vki/vki-scnums-shared-linux.h

diff --git a/NEWS b/NEWS
index 065f32fd5c0a6edcf2fcf8ab47b3d2c1c80b6ef9..a1a5fa24d381a4b142af3adbeb77a639a19dd4ce 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -30,6 +30,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 503914  mount syscall param filesystemtype may be NULL
 504101  Add a "vgstack" script
 504177  FILE DESCRIPTORS banner shows when closing some inherited fds
+501741  syscall cachestat not wrapped
 
 To see details of a given bug, visit
   https://bugs.kde.org/show_bug.cgi?id=XXXXXX
index 4dad82dfbb26f40d18ddf79eb48ff73867cb921b..966eae543712a061611a29a7bc8edb2248b84f0e 100644 (file)
@@ -59,6 +59,7 @@ DECL_TEMPLATE(linux, sys_tee);
 DECL_TEMPLATE(linux, sys_vmsplice);
 DECL_TEMPLATE(linux, sys_readahead);
 DECL_TEMPLATE(linux, sys_move_pages);
+DECL_TEMPLATE(linux, sys_cachestat);
 
 // clone is similar enough between linux variants to have a generic
 // version, but which will call an extern defined in syswrap-<platform>-linux.c
index 646a832408f5d20476cc5c0e3b1c5b107aa2ad66..c22683192643313828ec3a340d43bfc68d0e4907 100644 (file)
@@ -902,6 +902,7 @@ static SyscallTableEntry syscall_table[] = {
 
    LINXY(__NR_memfd_secret,      sys_memfd_secret),      // 447
 
+   LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_(__NR_fchmodat2,         sys_fchmodat2),         // 452
 };
 
index a12053dd07420aa57034c01030a05c925bf5624e..05cd1e4b65a3014b18fa1e0ca208c56da5878dc0 100644 (file)
@@ -1073,6 +1073,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_landlock_add_rule,       sys_landlock_add_rule),       // 445
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
 
+   LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_(__NR_fchmodat2,         sys_fchmodat2),         // 452
 };
 
index c8bb486c4ba334ef6ea62d422f7d0cda0074ff18..28cb3647c46c987fc83e5e80d6dd1808bee7e879 100644 (file)
@@ -853,6 +853,7 @@ static SyscallTableEntry syscall_main_table[] = {
 
    LINXY(__NR_memfd_secret,      sys_memfd_secret),      // 447
 
+   LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_(__NR_fchmodat2,         sys_fchmodat2),         // 452
 };
 
index afd4a618b12f7f76a84a5044f7432e44592d1e77..d4653d027396f924af8814a2875d4761d0bd336b 100644 (file)
@@ -6196,6 +6196,26 @@ PRE(sys_fchmodat)
    PRE_MEM_RASCIIZ( "fchmodat(path)", ARG2 );
 }
 
+PRE(sys_cachestat)
+{
+    PRINT("sys_cachestat ( %lu, %#lx, %#lx, %lu )", ARG1, ARG2, ARG3, ARG4);
+    PRE_REG_READ4(long, "cachestat",
+                  unsigned long, fd, struct vki_cachestat_range  *, cstat_range,
+                  struct vki_cachestat*, cstat, unsigned long, flags);
+    if (!ML_(fd_allowed)(ARG1, "cachestat", tid, False))
+        SET_STATUS_Failure( VKI_EBADF );
+    const struct vki_cachestat_range *cstat_range = (struct vki_cachestat_range *)(Addr)ARG2;
+    PRE_MEM_READ("cachestat(cstat_range)", ARG2, sizeof(*cstat_range) );
+    const struct vki_cachestat *cstat = (struct vki_cachestat *)(Addr)ARG3;
+    PRE_MEM_WRITE("cachestat(cstat)", ARG3, sizeof(*cstat) );
+}
+
+POST(sys_cachestat)
+{
+    vg_assert(SUCCESS);
+    POST_MEM_WRITE(ARG3, sizeof(struct vki_cachestat));
+}
+
 PRE(sys_fchmodat2)
 {
    FUSE_COMPATIBLE_MAY_BLOCK();
index 3644a088e516c364fbdb8bcdd46aac4553471e20..d16a9a4bc1f867c795588c6ab91182af9fff79fc 100644 (file)
@@ -1180,6 +1180,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_landlock_add_rule,       sys_landlock_add_rule),       // 445
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
 
+   LINXY(__NR_cachestat,               sys_cachestat),               // 451
    LINX_(__NR_fchmodat2,               sys_fchmodat2),               // 452
 };
 
index ba73b68d8fc3a8d83326ce268d1371c383f29b4e..fe1f3db7f5d9db714dbf9e1c5698428a2b324b4e 100644 (file)
@@ -835,6 +835,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_landlock_create_ruleset, sys_landlock_create_ruleset),
    LINX_ (__NR_landlock_add_rule, sys_landlock_add_rule),
    LINX_ (__NR_landlock_restrict_self, sys_landlock_restrict_self),
+   LINXY (__NR_cachestat, sys_cachestat),
    LINX_ (__NR_fchmodat2, sys_fchmodat2),
    LINXY (__NR_userfaultfd, sys_userfaultfd),
 };
index 728607317c9f4ec4671e92851bb7d5f5e7e3ad77..87153737d3ac6706a6595711a6fa57ebf13eb23b 100644 (file)
@@ -840,6 +840,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINXY (__NR_landlock_create_ruleset,sys_landlock_create_ruleset),
    LINX_ (__NR_landlock_add_rule,      sys_landlock_add_rule),
    LINX_ (__NR_landlock_restrict_self, sys_landlock_restrict_self),
+   LINXY (__NR_cachestat,              sys_cachestat),
    LINX_ (__NR_fchmodat2,              sys_fchmodat2),
 };
 
index 089a9a59b06c96ba6d179a83458ce3a9bcd1c2de..bc180b8b1c1ee267f58c00d0a48b3fbabef87aa1 100644 (file)
@@ -1079,6 +1079,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_landlock_add_rule,       sys_landlock_add_rule),       // 445
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
 
+   LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_ (__NR_fchmodat2,        sys_fchmodat2),         // 452
 };
 
index 007fa6336c0ef646c4fd900922b88e7baf407b7d..6e97358e89b1d14f34c72169edb2481a64662c2d 100644 (file)
@@ -1046,6 +1046,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_landlock_add_rule,       sys_landlock_add_rule),       // 445
    LINX_(__NR_landlock_restrict_self,  sys_landlock_restrict_self),  // 446
 
+   LINXY (__NR_cachestat,        sys_cachestat),         // 451
    LINX_ (__NR_fchmodat2,        sys_fchmodat2),         // 452
 };
 
index ebf9c3105339d160ba204e27653730a1627c1931..7a1ff0751884f63478f4397b49422dfa696e45e3 100644 (file)
@@ -597,6 +597,7 @@ static SyscallTableEntry syscall_main_table[] = {
    LINX_(__NR_landlock_add_rule, sys_landlock_add_rule),           /* 445 */
    LINX_(__NR_landlock_restrict_self, sys_landlock_restrict_self), /* 446 */
    LINXY(__NR_memfd_secret, sys_memfd_secret),                     /* 447 */
+   LINXY(__NR_cachestat, sys_cachestat),                           /* 451 */
    LINX_(__NR_fchmodat2, sys_fchmodat2),                           /* 452 */
 };
 
index 9191c2093d870f8f947a7eee2ab39f0f97a9d25f..f4ceae4613f2637e933141e5101e2ba39ab15f16 100644 (file)
@@ -888,6 +888,7 @@ static SyscallTableEntry syscall_table[] = {
 
    LINXY(__NR_memfd_secret, sys_memfd_secret),                        // 447
 
+   LINXY (__NR_cachestat, sys_cachestat),                             // 451
    LINX_ (__NR_fchmodat2, sys_fchmodat2),                             // 452
 };
 
index d7f173cd91b028333cd03ba5f79dbe8cbf844ec7..662780588af41e79622d68509d8ef43683c76f6f 100644 (file)
@@ -1674,6 +1674,7 @@ static SyscallTableEntry syscall_table[] = {
 
    LINXY(__NR_memfd_secret,      sys_memfd_secret),      // 447
 
+   LINXY(__NR_cachestat,         sys_cachestat),         // 451
    LINX_(__NR_fchmodat2,         sys_fchmodat2),         // 452
 };
 
index 29e62ce86351f94d7400820ff975e693ae29c950..0d2bed6dc6ae719b33271d7cd44d96f62cd039d8 100644 (file)
@@ -5478,6 +5478,19 @@ struct vki_open_how {
 #define VKI_CLOSE_RANGE_UNSHARE (1U << 1)
 #define VKI_CLOSE_RANGE_CLOEXEC (1U << 2)
 
+struct vki_cachestat_range {
+    __vki_u64 off;
+    __vki_u64 len;
+};
+
+struct vki_cachestat {
+    __vki_u64 nr_cache;
+    __vki_u64 nr_dirty;
+    __vki_u64 nr_writeback;
+    __vki_u64 nr_evicted;
+    __vki_u64 nr_recently_evicted;
+};
+
 //----------------------------------------------------------------------
 // From linux/magic.h
 //----------------------------------------------------------------------
index 20346ca716785386362798626da745ebcdb59244..616f8052d379b0c070d0ec775c01c677393206fa 100644 (file)
@@ -54,6 +54,7 @@
 
 #define __NR_memfd_secret              447
 
+#define __NR_cachestat         451
 #define __NR_fchmodat2         452
 
 #endif