From: Vitaliy Makkoveev Subject: Re: ddb mbuf chains To: Alexander Bluhm , tech@openbsd.org Date: Thu, 5 Sep 2024 10:29:21 +0300 On Thu, Sep 05, 2024 at 07:20:42AM +0200, Claudio Jeker wrote: > On Thu, Sep 05, 2024 at 12:38:41AM +0200, Alexander Bluhm wrote: > > On Thu, Aug 29, 2024 at 09:15:54PM +0200, Alexander Bluhm wrote: > > > On Wed, Aug 28, 2024 at 10:43:16PM +0200, Alexander Bluhm wrote: > > > > I want to print the layout of mbuf chains in ddb. For debugging > > > > hardware offloading, DMA requirements and bounce buffers, I need > > > > to know the layout of the mbuf chain by m_next and m_nextpkt pointer. > > > > So I implemented /c and /p modifiers for ddb show mbuf. > > > > > > > > ddb> show mbuf /pc 0xfffffd8006fd5100 > > > > > > Additionally we can print mbuf type and offset. Then a UDP receive > > > socket buffer looks like this: > > > > > > ++- mbuf 0xfffffd806dcddd00, nam, off 0, len 16 > > > |+- mbuf 0xfffffd806dcddf00, dat, off 52, len 1472, pktlen 2049, clsize 2048 > > > |+- mbuf 0xfffffd806dcdd400, dat, off 44, len 577, clsize 2048 > > > |\- total chain 3, len 2065, size 4320 > > > ++- mbuf 0xfffffd806dcdde00, nam, off 0, len 16 > > > |+- mbuf 0xfffffd806dcdd800, dat, off 52, len 4, pktlen 4, clsize 2048 > > > |\- total chain 2, len 20, size 2272 > > > \-- total packets 2 > > > > A m->m_type >= 0 check was missing. > > One could wonder why m_type is a short? > The next `mh_flags' is u_short, so this saves a little bit of memory? > > > ok? > > > > Anyone? > > OK claudio@ > Also ok by me. > > bluhm > > > > > > Index: sys/ddb/db_command.c > > =================================================================== > > RCS file: /data/mirror/openbsd/cvs/src/sys/ddb/db_command.c,v > > diff -u -p -r1.101 db_command.c > > --- sys/ddb/db_command.c 13 May 2024 01:15:50 -0000 1.101 > > +++ sys/ddb/db_command.c 29 Aug 2024 17:57:18 -0000 > > @@ -340,7 +340,15 @@ db_malloc_print_cmd(db_expr_t addr, int > > void > > db_mbuf_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif) > > { > > - m_print((void *)addr, db_printf); > > + if ((modif[0] == 'c' && modif[1] == 'p') || > > + (modif[0] == 'p' && modif[1] == 'c')) > > + m_print_packet((void *)addr, 1, db_printf); > > + else if (modif[0] == 'c') > > + m_print_chain((void *)addr, 0, db_printf); > > + else if (modif[0] == 'p') > > + m_print_packet((void *)addr, 0, db_printf); > > + else > > + m_print((void *)addr, db_printf); > > } > > > > void > > Index: sys/ddb/db_interface.h > > =================================================================== > > RCS file: /data/mirror/openbsd/cvs/src/sys/ddb/db_interface.h,v > > diff -u -p -r1.27 db_interface.h > > --- sys/ddb/db_interface.h 3 Feb 2024 18:51:58 -0000 1.27 > > +++ sys/ddb/db_interface.h 29 Aug 2024 17:57:18 -0000 > > @@ -61,6 +61,8 @@ void db_show_all_pools(db_expr_t, int, d > > > > /* kern/uipc_mbuf.c */ > > void m_print(void *, int (*)(const char *, ...)); > > +void m_print_chain(void *, int, int (*)(const char *, ...)); > > +void m_print_packet(void *, int, int (*)(const char *, ...)); > > > > /* kern/uipc_socket.c */ > > void so_print(void *, int (*)(const char *, ...)); > > Index: sys/kern/uipc_mbuf.c > > =================================================================== > > RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_mbuf.c,v > > diff -u -p -r1.291 uipc_mbuf.c > > --- sys/kern/uipc_mbuf.c 29 Aug 2024 10:44:40 -0000 1.291 > > +++ sys/kern/uipc_mbuf.c 29 Aug 2024 19:18:25 -0000 > > @@ -1533,6 +1533,80 @@ m_print(void *v, > > > > } > > } > > + > > +const char *m_types[MT_NTYPES] = { > > + "fre", > > + "dat", > > + "hdr", > > + "nam", > > + "opt", > > + "ftb", > > + "ctl", > > + "oob", > > +}; > > + > > +void > > +m_print_chain(void *v, int deep, > > + int (*pr)(const char *, ...) __attribute__((__format__(__kprintf__,1,2)))) > > +{ > > + struct mbuf *m; > > + const char *indent = deep ? "++-" : "-+-"; > > + size_t chain = 0, len = 0, size = 0; > > + > > + for (m = v; m != NULL; m = m->m_next) { > > + const char *type; > > + > > + chain++; > > + len += m->m_len; > > + size += M_SIZE(m); > > + type = (m->m_type >= 0 && m->m_type < MT_NTYPES) ? > > + m_types[m->m_type] : "???"; > > + (*pr)("%s mbuf %p, %s, off %zd, len %u", indent, m, type, > > + m->m_data - M_DATABUF(m), m->m_len); > > + if (m->m_flags & M_PKTHDR) > > + (*pr)(", pktlen %d", m->m_pkthdr.len); > > + if (m->m_flags & M_EXT) > > + (*pr)(", clsize %u", m->m_ext.ext_size); > > + (*pr)("\n"); > > + indent = deep ? "|+-" : " +-"; > > + } > > + indent = deep ? "|\\-" : " \\-"; > > + if (v != NULL) { > > + (*pr)("%s total chain %zu, len %zu, size %zu\n", > > + indent, chain, len, size); > > + } > > +} > > + > > +void > > +m_print_packet(void *v, int deep, > > + int (*pr)(const char *, ...) __attribute__((__format__(__kprintf__,1,2)))) > > +{ > > + struct mbuf *m, *n; > > + const char *indent = "+--"; > > + size_t pkts = 0; > > + > > + for (m = v; m != NULL; m = m->m_nextpkt) { > > + size_t chain = 0, len = 0, size = 0; > > + > > + pkts++; > > + if (deep) { > > + m_print_chain(m, deep, pr); > > + continue; > > + } > > + for (n = m; n != NULL; n = n->m_next) { > > + chain++; > > + len += n->m_len; > > + size += M_SIZE(n); > > + } > > + (*pr)("%s mbuf %p, chain %zu", indent, m, chain); > > + if (m->m_flags & M_PKTHDR) > > + (*pr)(", pktlen %d", m->m_pkthdr.len); > > + (*pr)(", len %zu, size %zu\n", len, size); > > + } > > + indent = "\\--"; > > + if (v != NULL) > > + (*pr)("%s total packets %zu\n", indent, pkts); > > +} > > #endif > > > > /* > > Index: share/man/man4/ddb.4 > > =================================================================== > > RCS file: /data/mirror/openbsd/cvs/src/share/man/man4/ddb.4,v > > diff -u -p -r1.107 ddb.4 > > --- share/man/man4/ddb.4 5 Feb 2024 21:33:00 -0000 1.107 > > +++ share/man/man4/ddb.4 28 Aug 2024 19:51:26 -0000 > > @@ -658,7 +658,11 @@ If the > > .Cm /f > > modifier is specified, the complete map is printed. > > .\" -------------------- > > -.It Ic show mbuf Ar addr > > +.It Xo > > +.Ic show mbuf > > +.Op Cm /cp > > +.Ar addr > > +.Xc > > Prints the > > .Vt struct mbuf > > header at > > @@ -668,6 +672,13 @@ Depending on the mbuf flags > > and > > .Vt struct m_ext > > are printed as well. > > +If the > > +.Cm /c > > +modifier is specified, print the mbuf chain linked with the m_next > > +pointer. > > +.Cm /p > > +does the same using m_nextpkt. > > +Both can be combined. > > .\" -------------------- > > .It Xo > > .Ic show mount > > > > -- > :wq Claudio >