};
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;
+}
{ 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)
{
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;
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 *);
// 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;
+}
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 = {
.free = rt_free,
.dump = rt_res_dump,
.lookup = NULL,
- .memsize = NULL,
+ .memsize = rt_res_memsize,
};
static struct idm rtable_idm;