diff options
author | Conrad Meyer <cem@FreeBSD.org> | 2019-05-07 17:47:20 +0000 |
---|---|---|
committer | Conrad Meyer <cem@FreeBSD.org> | 2019-05-07 17:47:20 +0000 |
commit | 7d7db5298d505495426c2f0790707757fd7c6acb (patch) | |
tree | 6168ea2d5cc5ae447ebe8c6c3fdd7fe381bb879a /sys/kern/subr_bus.c | |
parent | 5350e15d0d85c3ffb021adab9304b7e4b1ab7f08 (diff) | |
download | src-7d7db5298d505495426c2f0790707757fd7c6acb.tar.gz src-7d7db5298d505495426c2f0790707757fd7c6acb.zip |
device_printf: Use sbuf for more coherent prints on SMP
device_printf does multiple calls to printf allowing other console messages to
be inserted between the device name, and the rest of the message. This change
uses sbuf to compose to two into a single buffer, and prints it all at once.
It exposes an sbuf drain function (drain-to-printf) for common use.
Update documentation to match; some unit tests included.
Submitted by: jmg
Sponsored by: Dell EMC Isilon
Differential Revision: https://reviews.freebsd.org/D16690
Notes
Notes:
svn path=/head/; revision=347229
Diffstat (limited to 'sys/kern/subr_bus.c')
-rw-r--r-- | sys/kern/subr_bus.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c index b43a4f18180b..e0818b8f931b 100644 --- a/sys/kern/subr_bus.c +++ b/sys/kern/subr_bus.c @@ -2431,13 +2431,31 @@ device_print_prettyname(device_t dev) int device_printf(device_t dev, const char * fmt, ...) { + char buf[128]; + struct sbuf sb; + const char *name; va_list ap; - int retval; + size_t retval; + + retval = 0; + + sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN); + sbuf_set_drain(&sb, sbuf_printf_drain, &retval); + + name = device_get_name(dev); + + if (name == NULL) + sbuf_cat(&sb, "unknown: "); + else + sbuf_printf(&sb, "%s%d: ", name, device_get_unit(dev)); - retval = device_print_prettyname(dev); va_start(ap, fmt); - retval += vprintf(fmt, ap); + sbuf_vprintf(&sb, fmt, ap); va_end(ap); + + sbuf_finish(&sb); + sbuf_delete(&sb); + return (retval); } |