Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148160490
D21165.id60486.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D21165.id60486.diff
View Options
Index: sys/geom/geom.h
===================================================================
--- sys/geom/geom.h
+++ sys/geom/geom.h
@@ -346,6 +346,7 @@
int g_write_data(struct g_consumer *cp, off_t offset, void *ptr, off_t length);
int g_delete_data(struct g_consumer *cp, off_t offset, off_t length);
void g_print_bio(struct bio *bp);
+void g_format_bio(struct sbuf *, struct bio *bp);
int g_use_g_read_data(void *, off_t, void **, int);
int g_use_g_write_data(void *, off_t, void *, int);
Index: sys/geom/geom_int.h
===================================================================
--- sys/geom/geom_int.h
+++ sys/geom/geom_int.h
@@ -37,9 +37,22 @@
* $FreeBSD$
*/
+#pragma once
+
LIST_HEAD(class_list_head, g_class);
TAILQ_HEAD(g_tailq_head, g_geom);
+#define _GEOM_DEBUG(gcls, ctrlvar, loglvl, biop, formatstr, ...) do { \
+ const int __control = (ctrlvar); \
+ const int __level = (loglvl); \
+ \
+ if (__control < __level) \
+ break; \
+ \
+ g_dbg_printf((gcls), (__control > 0) ? __level : -1, (biop), \
+ ": " formatstr, ## __VA_ARGS__); \
+} while (0)
+
extern int g_collectstats;
#define G_STATS_PROVIDERS 1 /* Collect I/O stats for providers */
#define G_STATS_CONSUMERS 2 /* Collect I/O stats for consumers */
@@ -60,7 +73,7 @@
void g_confxml(void *, int flag);
void g_conf_specific(struct sbuf *sb, struct g_class *mp, struct g_geom *gp, struct g_provider *pp, struct g_consumer *cp);
void g_conf_cat_escaped(struct sbuf *sb, const char *buf);
-void g_conf_printf_escaped(struct sbuf *sb, const char *fmt, ...);
+void g_conf_printf_escaped(struct sbuf *sb, const char *fmt, ...) __printflike(2, 3);
void g_confdot(void *, int flag);
void g_conftxt(void *, int flag);
@@ -73,6 +86,7 @@
extern struct class_list_head g_classes;
extern char *g_wait_event, *g_wait_sim, *g_wait_up, *g_wait_down;
void g_wither_washer(void);
+void g_dbg_printf(const char *gcls, int lvl, struct bio *bp, const char *format, ...) __printflike(4, 5);
/* geom_io.c */
void g_io_init(void);
Index: sys/geom/geom_io.c
===================================================================
--- sys/geom/geom_io.c
+++ sys/geom/geom_io.c
@@ -49,6 +49,7 @@
#include <sys/bio.h>
#include <sys/ktr.h>
#include <sys/proc.h>
+#include <sys/sbuf.h>
#include <sys/stack.h>
#include <sys/sysctl.h>
#include <sys/vmem.h>
@@ -1030,6 +1031,24 @@
void
g_print_bio(struct bio *bp)
+{
+#ifndef PRINTF_BUFR_SIZE
+#define PRINTF_BUFR_SIZE 64
+#endif
+ char bufr[PRINTF_BUFR_SIZE];
+ struct sbuf sb, *sbp __unused;
+
+ sbp = sbuf_new(&sb, bufr, sizeof(bufr), SBUF_FIXEDLEN);
+ KASSERT(sbp != NULL, ("sbuf_new misused?"));
+
+ sbuf_set_drain(&sb, sbuf_printf_drain, NULL);
+ g_format_bio(&sb, bp);
+ sbuf_finish(&sb);
+ sbuf_delete(&sb);
+}
+
+void
+g_format_bio(struct sbuf *sb, struct bio *bp)
{
const char *pname, *cmd = NULL;
@@ -1041,11 +1060,12 @@
switch (bp->bio_cmd) {
case BIO_GETATTR:
cmd = "GETATTR";
- printf("%s[%s(attr=%s)]", pname, cmd, bp->bio_attribute);
+ sbuf_printf(sb, "%s[%s(attr=%s)]", pname, cmd,
+ bp->bio_attribute);
return;
case BIO_FLUSH:
cmd = "FLUSH";
- printf("%s[%s]", pname, cmd);
+ sbuf_printf(sb, "%s[%s]", pname, cmd);
return;
case BIO_ZONE: {
char *subcmd = NULL;
@@ -1073,7 +1093,7 @@
subcmd = "UNKNOWN";
break;
}
- printf("%s[%s,%s]", pname, cmd, subcmd);
+ sbuf_printf(sb, "%s[%s,%s]", pname, cmd, subcmd);
return;
}
case BIO_READ:
@@ -1087,9 +1107,9 @@
break;
default:
cmd = "UNKNOWN";
- printf("%s[%s()]", pname, cmd);
+ sbuf_printf(sb, "%s[%s()]", pname, cmd);
return;
}
- printf("%s[%s(offset=%jd, length=%jd)]", pname, cmd,
+ sbuf_printf(sb, "%s[%s(offset=%jd, length=%jd)]", pname, cmd,
(intmax_t)bp->bio_offset, (intmax_t)bp->bio_length);
}
Index: sys/geom/geom_subr.c
===================================================================
--- sys/geom/geom_subr.c
+++ sys/geom/geom_subr.c
@@ -77,6 +77,43 @@
int post;
};
+void
+g_dbg_printf(const char *gcls, int lvl, struct bio *bp, const char *format,
+ ...)
+{
+#ifndef PRINTF_BUFR_SIZE
+#define PRINTF_BUFR_SIZE 64
+#endif
+ char bufr[PRINTF_BUFR_SIZE];
+ struct sbuf sb, *sbp __unused;
+ va_list ap;
+
+ sbp = sbuf_new(&sb, bufr, sizeof(bufr), SBUF_FIXEDLEN);
+ KASSERT(sbp != NULL, ("sbuf_new misused?"));
+
+ sbuf_set_drain(&sb, sbuf_printf_drain, NULL);
+
+ sbuf_cat(&sb, gcls);
+ if (lvl >= 0)
+ sbuf_printf(&sb, "[%d]", lvl);
+
+ va_start(ap, format);
+ sbuf_vprintf(&sb, format, ap);
+ va_end(ap);
+
+ if (bp != NULL) {
+ sbuf_putc(&sb, ' ');
+ g_format_bio(&sb, bp);
+ }
+
+ /* Terminate the debug line with a single '\n'. */
+ sbuf_nl_terminate(&sb);
+
+ /* Flush line to printf. */
+ sbuf_finish(&sb);
+ sbuf_delete(&sb);
+}
+
/*
* This event offers a new class a chance to taste all preexisting providers.
*/
Index: sys/geom/label/g_label.h
===================================================================
--- sys/geom/label/g_label.h
+++ sys/geom/label/g_label.h
@@ -34,6 +34,7 @@
#include <sys/endian.h>
#ifdef _KERNEL
#include <sys/sysctl.h>
+#include <geom/geom_int.h>
#endif
#define G_LABEL_CLASS_NAME "LABEL"
@@ -50,16 +51,8 @@
#ifdef _KERNEL
extern u_int g_label_debug;
-#define G_LABEL_DEBUG(lvl, ...) do { \
- if (g_label_debug >= (lvl)) { \
- printf("GEOM_LABEL"); \
- if (g_label_debug > 0) \
- printf("[%u]", lvl); \
- printf(": "); \
- printf(__VA_ARGS__); \
- printf("\n"); \
- } \
-} while (0)
+#define G_LABEL_DEBUG(lvl, ...) \
+ _GEOM_DEBUG("GEOM_LABEL", g_label_debug, (lvl), NULL, __VA_ARGS__)
SYSCTL_DECL(_kern_geom_label);
Index: sys/geom/mirror/g_mirror.h
===================================================================
--- sys/geom/mirror/g_mirror.h
+++ sys/geom/mirror/g_mirror.h
@@ -34,6 +34,10 @@
#include <sys/endian.h>
#include <sys/md5.h>
+#ifdef _KERNEL
+#include <geom/geom_int.h>
+#endif
+
#define G_MIRROR_CLASS_NAME "MIRROR"
#define G_MIRROR_MAGIC "GEOM::MIRROR"
@@ -86,28 +90,10 @@
extern int g_mirror_debug;
-#define G_MIRROR_DEBUG(lvl, ...) do { \
- if (g_mirror_debug >= (lvl)) { \
- printf("GEOM_MIRROR"); \
- if (g_mirror_debug > 0) \
- printf("[%u]", lvl); \
- printf(": "); \
- printf(__VA_ARGS__); \
- printf("\n"); \
- } \
-} while (0)
-#define G_MIRROR_LOGREQ(lvl, bp, ...) do { \
- if (g_mirror_debug >= (lvl)) { \
- printf("GEOM_MIRROR"); \
- if (g_mirror_debug > 0) \
- printf("[%u]", lvl); \
- printf(": "); \
- printf(__VA_ARGS__); \
- printf(" "); \
- g_print_bio(bp); \
- printf("\n"); \
- } \
-} while (0)
+#define G_MIRROR_DEBUG(lvl, ...) \
+ _GEOM_DEBUG("GEOM_MIRROR", g_mirror_debug, (lvl), NULL, __VA_ARGS__)
+#define G_MIRROR_LOGREQ(lvl, bp, ...) \
+ _GEOM_DEBUG("GEOM_MIRROR", g_mirror_debug, (lvl), (bp), __VA_ARGS__)
#define G_MIRROR_BIO_FLAG_REGULAR 0x01
#define G_MIRROR_BIO_FLAG_SYNC 0x02
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Mar 17, 4:26 AM (4 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29807602
Default Alt Text
D21165.id60486.diff (6 KB)
Attached To
Mode
D21165: GEOM: Reduce unnecessary log interleaving with sbufs
Attached
Detach File
Event Timeline
Log In to Comment