aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/subr_bus.c
diff options
context:
space:
mode:
authorConrad Meyer <cem@FreeBSD.org>2019-05-07 17:47:20 +0000
committerConrad Meyer <cem@FreeBSD.org>2019-05-07 17:47:20 +0000
commit7d7db5298d505495426c2f0790707757fd7c6acb (patch)
tree6168ea2d5cc5ae447ebe8c6c3fdd7fe381bb879a /sys/kern/subr_bus.c
parent5350e15d0d85c3ffb021adab9304b7e4b1ab7f08 (diff)
downloadsrc-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.c24
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);
}