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
>