dt: add static vfs probes

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

dt: add static vfs probes

Jasper Lievisse Adriaanse-2
Hi,

Whilst analyzing the cleaner I added tracepoints called 'cleaner' and 'bufcache_take' to
track its behaviour.

For the sake of symmetry I've added one in bufcache_release() too and moved the assignment
of 'pages' until after the KASSERT(), following the flow of bufcache_take().

Sample usage of these probes:

tracepoint:vfs:bufcache_take {
        printf("bcache_take:%d(%s) flags: 0x%x cache: %d pages: %d\n",
                tid, comm, arg0 , arg1, arg2);
}

tracepoint:vfs:bufcache_rel{
        printf("bcache_rel:%d(%s) flags: 0x%x cache: %d pages: %d\n",
                tid, comm, arg0, arg1, arg2);
}

tracepoint:vfs:cleaner{
        printf("cleaner:%d(%s) flags: 0x%x pushed: %d lodirtypages: %d, hidirtypages: %d\n",
                tid, comm, arg0, arg1, arg2, arg3);
}

OK to commit this?

Index: dev/dt/dt_prov_static.c
===================================================================
RCS file: /cvs/src/sys/dev/dt/dt_prov_static.c,v
retrieving revision 1.4
diff -u -p -r1.4 dt_prov_static.c
--- dev/dt/dt_prov_static.c 13 Sep 2020 14:55:08 -0000 1.4
+++ dev/dt/dt_prov_static.c 14 Sep 2020 10:43:43 -0000
@@ -58,6 +58,13 @@ DT_STATIC_PROBE3(uvm, map_insert, "vaddr
 DT_STATIC_PROBE3(uvm, map_remove, "vaddr_t", "vaddr_t", "vm_prot_t");
 
 /*
+ * VFS
+ */
+DT_STATIC_PROBE3(vfs, bufcache_rel, "long", "int", "int64_t");
+DT_STATIC_PROBE3(vfs, bufcache_take, "long", "int", "int64_t");
+DT_STATIC_PROBE4(vfs, cleaner, "long", "int", "long", "long");
+
+/*
  * List of all static probes
  */
 struct dt_probe *dtps_static[] = {
@@ -76,6 +83,10 @@ struct dt_probe *dtps_static[] = {
  &_DT_STATIC_P(uvm, fault),
  &_DT_STATIC_P(uvm, map_insert),
  &_DT_STATIC_P(uvm, map_remove),
+ /* VFS */
+ &_DT_STATIC_P(vfs, bufcache_rel),
+ &_DT_STATIC_P(vfs, bufcache_take),
+ &_DT_STATIC_P(vfs, cleaner),
 };
 
 int
Index: kern/vfs_bio.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_bio.c,v
retrieving revision 1.202
diff -u -p -r1.202 vfs_bio.c
--- kern/vfs_bio.c 12 Sep 2020 11:57:24 -0000 1.202
+++ kern/vfs_bio.c 14 Sep 2020 10:43:43 -0000
@@ -57,6 +57,7 @@
 #include <sys/conf.h>
 #include <sys/kernel.h>
 #include <sys/specdev.h>
+#include <sys/tracepoint.h>
 #include <uvm/uvm_extern.h>
 
 /* XXX Should really be in buf.h, but for uvm_constraint_range.. */
@@ -1209,6 +1210,9 @@ buf_daemon(void *arg)
  }
 
  while ((bp = bufcache_getdirtybuf())) {
+ TRACEPOINT(vfs, cleaner, bp->b_flags, pushed,
+    lodirtypages, hidirtypages);
+
  if (UNCLEAN_PAGES < lodirtypages &&
     bcstats.kvaslots_avail > 2 * RESERVE_SLOTS &&
     pushed >= 16)
@@ -1693,6 +1697,9 @@ bufcache_take(struct buf *bp)
  KASSERT((bp->cache < NUM_CACHES));
 
  pages = atop(bp->b_bufsize);
+
+ TRACEPOINT(vfs, bufcache_take, bp->b_flags, bp->cache, pages);
+
  struct bufcache *cache = &cleancache[bp->cache];
  if (!ISSET(bp->b_flags, B_DELWRI)) {
                 if (ISSET(bp->b_flags, B_COLD)) {
@@ -1756,8 +1763,11 @@ bufcache_release(struct buf *bp)
  int64_t pages;
  struct bufcache *cache = &cleancache[bp->cache];
 
- pages = atop(bp->b_bufsize);
  KASSERT(ISSET(bp->b_flags, B_BC));
+ pages = atop(bp->b_bufsize);
+
+ TRACEPOINT(vfs, bufcache_rel, bp->b_flags, bp->cache, pages);
+
  if (fliphigh) {
  if (ISSET(bp->b_flags, B_DMA) && bp->cache > 0)
  panic("B_DMA buffer release from cache %d",
--
jasper

Reply | Threaded
Open this post in threaded view
|

Re: dt: add static vfs probes

Bob Beck-2

ok beck@

On Mon, Sep 14, 2020 at 12:45:55PM +0200, Jasper Lievisse Adriaanse wrote:

> Hi,
>
> Whilst analyzing the cleaner I added tracepoints called 'cleaner' and 'bufcache_take' to
> track its behaviour.
>
> For the sake of symmetry I've added one in bufcache_release() too and moved the assignment
> of 'pages' until after the KASSERT(), following the flow of bufcache_take().
>
> Sample usage of these probes:
>
> tracepoint:vfs:bufcache_take {
>         printf("bcache_take:%d(%s) flags: 0x%x cache: %d pages: %d\n",
>                 tid, comm, arg0 , arg1, arg2);
> }
>
> tracepoint:vfs:bufcache_rel{
>         printf("bcache_rel:%d(%s) flags: 0x%x cache: %d pages: %d\n",
>                 tid, comm, arg0, arg1, arg2);
> }
>
> tracepoint:vfs:cleaner{
>         printf("cleaner:%d(%s) flags: 0x%x pushed: %d lodirtypages: %d, hidirtypages: %d\n",
>                 tid, comm, arg0, arg1, arg2, arg3);
> }
>
> OK to commit this?
>
> Index: dev/dt/dt_prov_static.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/dt/dt_prov_static.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 dt_prov_static.c
> --- dev/dt/dt_prov_static.c 13 Sep 2020 14:55:08 -0000 1.4
> +++ dev/dt/dt_prov_static.c 14 Sep 2020 10:43:43 -0000
> @@ -58,6 +58,13 @@ DT_STATIC_PROBE3(uvm, map_insert, "vaddr
>  DT_STATIC_PROBE3(uvm, map_remove, "vaddr_t", "vaddr_t", "vm_prot_t");
>  
>  /*
> + * VFS
> + */
> +DT_STATIC_PROBE3(vfs, bufcache_rel, "long", "int", "int64_t");
> +DT_STATIC_PROBE3(vfs, bufcache_take, "long", "int", "int64_t");
> +DT_STATIC_PROBE4(vfs, cleaner, "long", "int", "long", "long");
> +
> +/*
>   * List of all static probes
>   */
>  struct dt_probe *dtps_static[] = {
> @@ -76,6 +83,10 @@ struct dt_probe *dtps_static[] = {
>   &_DT_STATIC_P(uvm, fault),
>   &_DT_STATIC_P(uvm, map_insert),
>   &_DT_STATIC_P(uvm, map_remove),
> + /* VFS */
> + &_DT_STATIC_P(vfs, bufcache_rel),
> + &_DT_STATIC_P(vfs, bufcache_take),
> + &_DT_STATIC_P(vfs, cleaner),
>  };
>  
>  int
> Index: kern/vfs_bio.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/vfs_bio.c,v
> retrieving revision 1.202
> diff -u -p -r1.202 vfs_bio.c
> --- kern/vfs_bio.c 12 Sep 2020 11:57:24 -0000 1.202
> +++ kern/vfs_bio.c 14 Sep 2020 10:43:43 -0000
> @@ -57,6 +57,7 @@
>  #include <sys/conf.h>
>  #include <sys/kernel.h>
>  #include <sys/specdev.h>
> +#include <sys/tracepoint.h>
>  #include <uvm/uvm_extern.h>
>  
>  /* XXX Should really be in buf.h, but for uvm_constraint_range.. */
> @@ -1209,6 +1210,9 @@ buf_daemon(void *arg)
>   }
>  
>   while ((bp = bufcache_getdirtybuf())) {
> + TRACEPOINT(vfs, cleaner, bp->b_flags, pushed,
> +    lodirtypages, hidirtypages);
> +
>   if (UNCLEAN_PAGES < lodirtypages &&
>      bcstats.kvaslots_avail > 2 * RESERVE_SLOTS &&
>      pushed >= 16)
> @@ -1693,6 +1697,9 @@ bufcache_take(struct buf *bp)
>   KASSERT((bp->cache < NUM_CACHES));
>  
>   pages = atop(bp->b_bufsize);
> +
> + TRACEPOINT(vfs, bufcache_take, bp->b_flags, bp->cache, pages);
> +
>   struct bufcache *cache = &cleancache[bp->cache];
>   if (!ISSET(bp->b_flags, B_DELWRI)) {
>                  if (ISSET(bp->b_flags, B_COLD)) {
> @@ -1756,8 +1763,11 @@ bufcache_release(struct buf *bp)
>   int64_t pages;
>   struct bufcache *cache = &cleancache[bp->cache];
>  
> - pages = atop(bp->b_bufsize);
>   KASSERT(ISSET(bp->b_flags, B_BC));
> + pages = atop(bp->b_bufsize);
> +
> + TRACEPOINT(vfs, bufcache_rel, bp->b_flags, bp->cache, pages);
> +
>   if (fliphigh) {
>   if (ISSET(bp->b_flags, B_DMA) && bp->cache > 0)
>   panic("B_DMA buffer release from cache %d",
> --
> jasper
>