]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Table exporter journal dumping and memsize
authorMaria Matejka <mq@ucw.cz>
Mon, 16 Dec 2024 09:59:59 +0000 (10:59 +0100)
committerMaria Matejka <mq@ucw.cz>
Mon, 16 Dec 2024 11:31:26 +0000 (12:31 +0100)
The show-memory command wasn't showing the consumed memory
properly because it ignored the journal size. Now it does.

lib/lockfree.c
lib/lockfree.h
nest/route.h
nest/rt-export.c
nest/rt-table.c

index c68899d3588288843d4fdb24e0fdc65f28a007e5..adfca04e9c1e353f1179ad6c0f7cf87339dcae46 100644 (file)
@@ -604,3 +604,45 @@ lfjour_init(struct lfjour *j, struct settle_config *scf)
   };
   j->max_tokens = 20;
 }
+
+void
+lfjour_dump(struct dump_request *dreq, struct lfjour *j)
+{
+  RDUMP("item_size=%u, item_count=%u\n", j->item_size, j->item_count);
+
+  struct lfjour_item *first = atomic_load_explicit(&j->first, memory_order_relaxed);
+  RDUMP("first=%p", first);
+  if (first)
+    RDUMP(" (seq %lu)", first->seq);
+  RDUMP(", next_seq=%lu", j->next_seq);
+
+  RDUMP("max_tokens=%lu, issued_tokens=%lu",
+      j->max_tokens, atomic_load_explicit(&j->issued_tokens, memory_order_relaxed));
+
+  RDUMP("Blocks:\n");
+  dreq->indent += 3;
+  WALK_TLIST(lfjour_block, block, &j->pending)
+    RDUMP("%p: end=%u, not_last=%u\n", block,
+       atomic_load_explicit(&block->end, memory_order_relaxed),
+       atomic_load_explicit(&block->not_last, memory_order_relaxed)
+       );
+  dreq->indent -= 3;
+}
+
+struct resmem lfjour_memsize(struct lfjour *j)
+{
+  u64 blocks = 0;
+  WALK_TLIST(lfjour_block, block, &j->pending)
+    blocks++;
+
+  struct lfjour_item *first = atomic_load_explicit(&j->first, memory_order_relaxed);
+
+  if (!first)
+    return (struct resmem) { .overhead = blocks * page_size, };
+
+  struct resmem out;
+  out.effective = (j->next_seq - first->seq) * j->item_size;
+  out.overhead = blocks * page_size - out.effective;
+
+  return out;
+}
index 8dc8f82dc1246bc8d71b13b681bee5e4e8e20d6f..9df9667133c541fb611c40822b1b49fc06fc07cb 100644 (file)
@@ -277,7 +277,8 @@ static inline uint lfjour_count_recipients(struct lfjour *j)
 { return TLIST_LENGTH(lfjour_recipient, &j->recipients); }
 
 void lfjour_init(struct lfjour *, struct settle_config *);
-
+void lfjour_dump(struct dump_request *, struct lfjour *);
+struct resmem lfjour_memsize(struct lfjour *);
 
 static inline struct lfjour *lfjour_of_recipient(struct lfjour_recipient *r)
 {
index e512dc36b64d069a953407d39a7cee9161be98f0..fd46b04297aae9e756b808d035da688c664a57db 100644 (file)
@@ -164,11 +164,6 @@ struct rt_export_request {
       struct rt_feeding_request *next;         /* Next in request chain */
       void (*done)(struct rt_feeding_request *);/* Called when this refeed finishes */
       struct rt_prefilter prefilter;           /* Reload only matching nets */
-      PACKED enum {
-       RFRS_INACTIVE = 0,      /* Inactive request */
-       RFRS_PENDING,           /* Request enqueued, do not touch */
-       RFRS_RUNNING,           /* Request active, do not touch */
-      } state;
     } *feeding, *feed_pending;
     TLIST_DEFAULT_NODE;
     u8 trace_routes;
@@ -239,6 +234,10 @@ struct rt_export_item *rt_exporter_push(struct rt_exporter *, const struct rt_ex
 struct rt_export_feed *rt_alloc_feed(uint routes, uint exports);
 void rt_exporter_shutdown(struct rt_exporter *, void (*stopped)(struct rt_exporter *));
 
+void rt_exporter_dump(struct dump_request *, struct rt_exporter *);
+static inline struct resmem rt_exporter_memsize(struct rt_exporter *e)
+{ return lfjour_memsize(&e->journal); }
+
 /* Standalone feeds */
 void rt_feeder_subscribe(struct rt_exporter *, struct rt_export_feeder *);
 void rt_feeder_unsubscribe(struct rt_export_feeder *);
index a1d17a393bd1e62cfcc63f9b6f2614f2105f5af2..7368447dea76346823eb3997547a11aa49f01a31 100644 (file)
@@ -573,3 +573,20 @@ rt_exporter_shutdown(struct rt_exporter *e, void (*stopped)(struct rt_exporter *
 //  e->stopped = stopped;
     bug("not implemented yet");
 }
+
+void
+rt_exporter_dump(struct dump_request *dreq, struct rt_exporter *e)
+{
+  RDUMP("Feeders (max_feed_index=%u):\n",
+      atomic_load_explicit(&e->max_feed_index, memory_order_relaxed));
+  dreq->indent += 3;
+  WALK_TLIST(rt_export_feeder, f, &e->feeders)
+    RDUMP("%p (%s), index %u\n",
+       f, f->name, f->feed_index);
+  dreq->indent -= 3;
+
+  RDUMP("Journal:\n");
+  dreq->indent += 3;
+  lfjour_dump(dreq, &e->journal);
+  dreq->indent -= 3;
+}
index 295296bf57cf9c1a29fced9bcb22199300f76a9e..fd8bb50ddfb63f02e50750d388d91bc3303d6be2 100644 (file)
@@ -3243,15 +3243,28 @@ rt_res_dump(struct dump_request *dreq, resource *_r)
   RDUMP("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);
 
-#if 0
-  /* TODO: rethink this completely */
-  /* TODO: move this to lfjour */
-  char x[32];
-  bsprintf(x, "%%%dspending export %%p\n", indent + 2);
+  RDUMP("Exporter ALL:\n");
+  dreq->indent += 3;
+  rt_exporter_dump(dreq, &r->export_all);
+  dreq->indent -= 3;
+  RDUMP("Exporter BEST:\n");
+  dreq->indent += 3;
+  rt_exporter_dump(dreq, &r->export_best);
+  dreq->indent -= 3;
+}
 
-  WALK_TLIST(lfjour_block, n, &r->journal.pending)
-    debug(x, "", n);
-#endif
+static struct resmem
+rt_res_memsize(resource *_r)
+{
+  SKIP_BACK_DECLARE(struct rtable_private, r, r, _r);
+
+  struct resmem amem = rt_exporter_memsize(&r->export_all);
+  struct resmem bmem = rt_exporter_memsize(&r->export_best);
+
+  return (struct resmem) {
+    .effective = amem.effective + bmem.effective,
+    .overhead = amem.overhead + bmem.overhead,
+  };
 }
 
 static struct resclass rt_class = {
@@ -3260,7 +3273,7 @@ static struct resclass rt_class = {
   .free = rt_free,
   .dump = rt_res_dump,
   .lookup = NULL,
-  .memsize = NULL,
+  .memsize = rt_res_memsize,
 };
 
 static struct idm rtable_idm;