From d9f0f4af7dc49c22232cc3be5e40866fc7d5dda7 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Tue, 28 Feb 2023 10:42:47 +0100 Subject: [PATCH] Resource dumps also write out block addresses --- lib/event.c | 2 +- lib/mempool.c | 13 +++++++++++-- lib/resource.c | 18 +++++++----------- lib/resource.h | 4 ++-- lib/slab.c | 15 ++++++++++++--- lib/timer.c | 2 +- nest/config.Y | 2 +- nest/locks.c | 2 +- nest/rt-attr.c | 2 +- nest/rt-table.c | 9 ++++++++- proto/bfd/bfd.c | 2 +- proto/bgp/attrs.c | 2 +- sysdep/unix/io.c | 6 +++--- sysdep/unix/main.c | 2 +- 14 files changed, 51 insertions(+), 30 deletions(-) diff --git a/lib/event.c b/lib/event.c index 55e7f446..68888a4c 100644 --- a/lib/event.c +++ b/lib/event.c @@ -168,7 +168,7 @@ ev_postpone(event *e) } static void -ev_dump(resource *r) +ev_dump(resource *r, unsigned indent UNUSED) { event *e = (event *) r; diff --git a/lib/mempool.c b/lib/mempool.c index d10f8f1c..5200f5e7 100644 --- a/lib/mempool.c +++ b/lib/mempool.c @@ -42,7 +42,7 @@ struct linpool { }; static void lp_free(resource *); -static void lp_dump(resource *); +static void lp_dump(resource *, unsigned); static resource *lp_lookup(resource *, unsigned long); static struct resmem lp_memsize(resource *r); @@ -262,11 +262,12 @@ lp_free(resource *r) } static void -lp_dump(resource *r) +lp_dump(resource *r, unsigned indent) { linpool *m = (linpool *) r; struct lp_chunk *c; int cnt, cntl; + char x[32]; for(cnt=0, c=m->first; c; c=c->next, cnt++) ; @@ -277,6 +278,14 @@ lp_dump(resource *r) cntl, m->total, m->total_large); + + bsprintf(x, "%%%dschunk %%p\n", indent + 2); + for (c=m->first; c; c=c->next) + debug(x, "", c); + + bsprintf(x, "%%%dslarge %%p\n", indent + 2); + for (c=m->first_large; c; c=c->next) + debug(x, "", c); } static struct resmem diff --git a/lib/resource.c b/lib/resource.c index 2e367132..94b8d019 100644 --- a/lib/resource.c +++ b/lib/resource.c @@ -30,7 +30,7 @@ * is freed upon shutdown of the module. */ -static void pool_dump(resource *); +static void pool_dump(resource *, unsigned); static void pool_free(resource *); static resource *pool_lookup(resource *, unsigned long); static struct resmem pool_memsize(resource *P); @@ -46,8 +46,6 @@ static struct resclass pool_class = { pool root_pool; -static int indent; - /** * rp_new - create a resource pool * @p: parent pool @@ -95,16 +93,14 @@ pool_free(resource *P) } static void -pool_dump(resource *P) +pool_dump(resource *P, unsigned indent) { pool *p = (pool *) P; resource *r; debug("%s\n", p->name); - indent += 3; WALK_LIST(r, p->inside) - rdump(r); - indent -= 3; + rdump(r, indent + 3); } static struct resmem @@ -194,7 +190,7 @@ rfree(void *res) * It works by calling a class-specific dump function. */ void -rdump(void *res) +rdump(void *res, unsigned indent) { char x[16]; resource *r = res; @@ -204,7 +200,7 @@ rdump(void *res) if (r) { debug("%s ", r->class->name); - r->class->dump(r); + r->class->dump(r, indent); } else debug("NULL\n"); @@ -264,7 +260,7 @@ rlookup(unsigned long a) debug("Looking up %08lx\n", a); if (r = pool_lookup(&root_pool.r, a)) - rdump(r); + rdump(r, 3); else debug("Not found.\n"); } @@ -331,7 +327,7 @@ static void mbl_free(resource *r UNUSED) { } -static void mbl_debug(resource *r) +static void mbl_debug(resource *r, unsigned indent UNUSED) { struct mblock *m = (struct mblock *) r; diff --git a/lib/resource.h b/lib/resource.h index 5d9e2165..911b990d 100644 --- a/lib/resource.h +++ b/lib/resource.h @@ -30,7 +30,7 @@ struct resclass { char *name; /* Resource class name */ unsigned size; /* Standard size of single resource */ void (*free)(resource *); /* Freeing function */ - void (*dump)(resource *); /* Dump to debug output */ + void (*dump)(resource *, unsigned indent); /* Dump to debug output */ resource *(*lookup)(resource *, unsigned long); /* Look up address (only for debugging) */ struct resmem (*memsize)(resource *); /* Return size of memory used by the resource, may be NULL */ }; @@ -51,7 +51,7 @@ void resource_init(void); pool *rp_new(pool *, const char *); /* Create new pool */ pool *rp_newf(pool *, const char *, ...); /* Create a new pool with a formatted string as its name */ void rfree(void *); /* Free single resource */ -void rdump(void *); /* Dump to debug output */ +void rdump(void *, unsigned indent); /* Dump to debug output */ struct resmem rmemsize(void *res); /* Return size of memory used by the resource */ void rlookup(unsigned long); /* Look up address (only for debugging) */ void rmove(void *, pool *); /* Move to a different pool */ diff --git a/lib/slab.c b/lib/slab.c index cf2ecc70..23316e82 100644 --- a/lib/slab.c +++ b/lib/slab.c @@ -41,7 +41,7 @@ #endif static void slab_free(resource *r); -static void slab_dump(resource *r); +static void slab_dump(resource *r, unsigned indent); static resource *slab_lookup(resource *r, unsigned long addr); static struct resmem slab_memsize(resource *r); @@ -118,7 +118,7 @@ slab_free(resource *r) } static void -slab_dump(resource *r) +slab_dump(resource *r, unsigned indent UNUSED) { slab *s = (slab *) r; int cnt = 0; @@ -378,7 +378,7 @@ slab_free(resource *r) } static void -slab_dump(resource *r) +slab_dump(resource *r, unsigned indent UNUSED) { slab *s = (slab *) r; int ec=0, pc=0, fc=0; @@ -390,6 +390,15 @@ slab_dump(resource *r) WALK_TLIST(sl_head, h, &s->full_heads) fc++; debug("(%de+%dp+%df blocks per %d objs per %d bytes)\n", ec, pc, fc, s->objs_per_slab, s->obj_size); + + char x[16]; + bsprintf(x, "%%%ds%%s %%p\n", indent + 2); + WALK_TLIST(sl_head, h, &s->full_heads) + debug(x, "", "full", h); + WALK_TLIST(sl_head, h, &s->partial_heads) + debug(x, "", "partial", h); + WALK_TLIST(sl_head, h, &s->empty_heads) + debug(x, "", "empty", h); } static struct resmem diff --git a/lib/timer.c b/lib/timer.c index ff6975a4..4e4aa55e 100644 --- a/lib/timer.c +++ b/lib/timer.c @@ -58,7 +58,7 @@ tm_free(resource *r) } static void -tm_dump(resource *r) +tm_dump(resource *r, unsigned indent UNUSED) { timer *t = (void *) r; diff --git a/nest/config.Y b/nest/config.Y index dc174b7b..8c3ee8ad 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -868,7 +868,7 @@ sym_args: CF_CLI_HELP(DUMP, ..., [[Dump debugging information]]) CF_CLI(DUMP RESOURCES,,, [[Dump all allocated resource]]) -{ rdump(&root_pool); cli_msg(0, ""); } ; +{ rdump(&root_pool, 0); cli_msg(0, ""); } ; CF_CLI(DUMP SOCKETS,,, [[Dump open sockets]]) { sk_dump_all(); cli_msg(0, ""); } ; CF_CLI(DUMP EVENTS,,, [[Dump event log]]) diff --git a/nest/locks.c b/nest/locks.c index fb245cdc..247d0c56 100644 --- a/nest/locks.c +++ b/nest/locks.c @@ -107,7 +107,7 @@ olock_free(resource *r) } static void -olock_dump(resource *r) +olock_dump(resource *r, unsigned indent UNUSED) { struct object_lock *l = (struct object_lock *) r; static char *olock_states[] = { "free", "locked", "waiting", "event" }; diff --git a/nest/rt-attr.c b/nest/rt-attr.c index 761ec0d9..903926f6 100644 --- a/nest/rt-attr.c +++ b/nest/rt-attr.c @@ -550,7 +550,7 @@ ea_class_ref_free(resource *r) } static void -ea_class_ref_dump(resource *r) +ea_class_ref_dump(resource *r, unsigned indent UNUSED) { struct ea_class_ref *ref = SKIP_BACK(struct ea_class_ref, r, r); debug("name \"%s\", type=%d\n", ref->class->name, ref->class->type); diff --git a/nest/rt-table.c b/nest/rt-table.c index 83230802..6be47470 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -2801,12 +2801,19 @@ rt_free(resource *_r) } static void -rt_res_dump(resource *_r) +rt_res_dump(resource *_r, unsigned indent) { struct rtable_private *r = SKIP_BACK(struct rtable_private, r, _r); debug("name \"%s\", addr_type=%s, rt_count=%u, use_count=%d\n", r->name, net_label[r->addr_type], r->rt_count, r->use_count); + + char x[32]; + bsprintf(x, "%%%dspending export %%p\n", indent + 2); + + node *n; + WALK_LIST(n, r->exporter.pending) + debug(x, "", n); } static struct resclass rt_class = { diff --git a/proto/bfd/bfd.c b/proto/bfd/bfd.c index 59134a22..1ef92b18 100644 --- a/proto/bfd/bfd.c +++ b/proto/bfd/bfd.c @@ -860,7 +860,7 @@ bfd_request_free(resource *r) } static void -bfd_request_dump(resource *r) +bfd_request_dump(resource *r, unsigned indent UNUSED) { struct bfd_request *req = (struct bfd_request *) r; diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c index 2f72719f..039fdff5 100644 --- a/proto/bgp/attrs.c +++ b/proto/bgp/attrs.c @@ -1839,7 +1839,7 @@ bgp_pending_tx_rfree(resource *r) HASH_WALK_END; } -static void bgp_pending_tx_dump(resource *r UNUSED) { debug("\n"); } +static void bgp_pending_tx_dump(resource *r UNUSED, unsigned indent UNUSED) { debug("\n"); } static struct resclass bgp_pending_tx_class = { .name = "BGP Pending TX", diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index fc1586ff..78908676 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -76,7 +76,7 @@ rf_free(resource *r) } static void -rf_dump(resource *r) +rf_dump(resource *r, unsigned indent UNUSED) { struct rfile *a = (struct rfile *) r; @@ -862,7 +862,7 @@ sk_reallocate(sock *s) } static void -sk_dump(resource *r) +sk_dump(resource *r, unsigned indent UNUSED) { sock *s = (sock *) r; static char *sk_type_names[] = { "TCP<", "TCP>", "TCP", "UDP", NULL, "IP", NULL, "MAGIC", "UNIX<", "UNIX", "SSH>", "SSH", "DEL!" }; @@ -2053,7 +2053,7 @@ sk_dump_all(void) { s = SKIP_BACK(sock, n, n); debug("%p ", s); - sk_dump(&s->r); + sk_dump(&s->r, 3); } debug("\n"); } diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c index ab076af6..a9ae842a 100644 --- a/sysdep/unix/main.c +++ b/sysdep/unix/main.c @@ -52,7 +52,7 @@ async_dump(void) { debug("INTERNAL STATE DUMP\n\n"); - rdump(&root_pool); + rdump(&root_pool, 0); sk_dump_all(); // XXXX tm_dump_all(); if_dump_all();