From nobody Fri Nov 3 16:18:01 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4SMQrn5Hytz4ygjv; Fri, 3 Nov 2023 16:18:01 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4SMQrn33Dcz4JLH; Fri, 3 Nov 2023 16:18:01 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1699028281; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=VVeBG87DKBXilPNX1+Emg8KIVrelX8kmtg+34X4rZ0Q=; b=uWkpV4PJkUjxa47cViLtACNr0muQOtOR8JoaC6qtAtZ8QApvEmAkdH0VYgypeVvqFizuLk mK3EA5cZ/71mYaMaeMwrjHzVZ+BJrt9wNuVmx+/cf8X3cB5klZqXAjhA7G/i4EcUJY+QYH hiTlTtGhXdB300XHW40S6pySyKpwj+YIrY/J5LAJSo57amhGQ0L2qd11GD2vc8XAC5t3FJ xXwowX02IrTIJayfNlQrnzo7ZE+UcTutV1PxVwvUXcxKtENZReIpvKK4ueGP6UbgON0R7t ISWVygMiFgljtTnWsL4HVg0ftoiCp6iXUa+gQToym2LIfvZAy/cIu0Niyb5AYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1699028281; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=VVeBG87DKBXilPNX1+Emg8KIVrelX8kmtg+34X4rZ0Q=; b=wW+oTjIQbmtazeI4s4OYUsKDXXfLjPoALBLVv16E+9wgonZDS1Sw0UXkd4xKaH8MLXCaNp H0m7HWVkS54xJeET/5ssg/dGStPCuJGa+wWxJoOxS/AKJyThSLMnGpmWlmLI2wDxYwJqav Zt8XpygAtQBDc2V+PvWKw0z/4WTbnk8UCDkatEsPGk1ffhY8osKf/rezNoIZZzss4m/7A5 ieNYsNltF2b+X+EypQMdinkwe7qI5yCDC3GvTwpV4hfW0Ik6NdUAiXULZ5Fu1KflgtaCGc L9yn9PnIjXT7qc9cII4ntKl8nQ7vIditouEmYnk4q8hvM3+x0wWvVxZ1OzqzdQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1699028281; a=rsa-sha256; cv=none; b=ewe8EWB6uMOszaWO9PRpEiptxSlezwWriUH2Itw7qWOVU0wTFnoYRsiv1e5RfV5Shr+jiq pUq7S4VGMoy9gypsk/vFFHRbGUo0kNZJouSLQzi0BeIz8X+p9PDnPmqxBum4F9IqAh1fjg xyu36ZVyUfll+hIAlM8xJNi5rO+8/psBedp8lSxhyt0l86Gbypez3IbOVMYUW/NZOgHfYK 49biMBooNMw+UEfklGDe0YsUw+hPJdJewc/UH96OFL2Fh/RD9UdSuf3HhgLYQm/nCdPepm OH9YJDDujXTfV5AxVZcj7RKDt6Dd03JXOxi8dt4uknJI1QJDxad/XjcPklrqkQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4SMQrn21cmz58s; Fri, 3 Nov 2023 16:18:01 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3A3GI1Fi097563; Fri, 3 Nov 2023 16:18:01 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3A3GI1Zc097560; Fri, 3 Nov 2023 16:18:01 GMT (envelope-from git) Date: Fri, 3 Nov 2023 16:18:01 GMT Message-Id: <202311031618.3A3GI1Zc097560@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 70f2356d364f - main - cam: Make cam_debug macros atomic List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 70f2356d364fdb7e2ff5487ae03125a338defd54 Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=70f2356d364fdb7e2ff5487ae03125a338defd54 commit 70f2356d364fdb7e2ff5487ae03125a338defd54 Author: Warner Losh AuthorDate: 2023-11-02 20:41:09 +0000 Commit: Warner Losh CommitDate: 2023-11-03 16:15:38 +0000 cam: Make cam_debug macros atomic The CAM_DEBUG* macros use multiple printfs to dump the data. This is suboptimal when tracing things that produce even a moderate amount since it gets intertwingled. I can't even turn on tracing with a 24-disk HBA on boot without it getting messed up. Add helper routines to work around clang's over-use of the stack: that way we only pay the stack penalty when a trace hits. Sponsored by: Netflix Reviewed by: ken, mav Differential Revision: https://reviews.freebsd.org/D42411 --- sys/cam/cam_debug.h | 67 ++++++++++++++++++++--------------------------- sys/cam/cam_xpt.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++------- sys/cam/cam_xpt.h | 4 +-- 3 files changed, 95 insertions(+), 51 deletions(-) diff --git a/sys/cam/cam_debug.h b/sys/cam/cam_debug.h index 1526f11f4c0d..8c04b1fd7ce9 100644 --- a/sys/cam/cam_debug.h +++ b/sys/cam/cam_debug.h @@ -81,57 +81,46 @@ extern uint32_t cam_dflags; /* Printf delay value (to prevent scrolling) */ extern uint32_t cam_debug_delay; -/* Debugging macros. */ -#define CAM_DEBUGGED(path, flag) \ - (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ - && (cam_dpath != NULL) \ - && (xpt_path_comp(cam_dpath, path) >= 0) \ - && (xpt_path_comp(cam_dpath, path) < 2)) - -#define CAM_DEBUG(path, flag, printfargs) \ - if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ - && (cam_dpath != NULL) \ - && (xpt_path_comp(cam_dpath, path) >= 0) \ - && (xpt_path_comp(cam_dpath, path) < 2)) { \ - xpt_print_path(path); \ - printf printfargs; \ - if (cam_debug_delay != 0) \ - DELAY(cam_debug_delay); \ - } +/* Helper routines -- helps conserve stack */ +struct cam_ed; +void xpt_cam_path_debug(struct cam_path *path, const char *fmt, ...); +void xpt_cam_dev_debug(struct cam_ed *dev, const char *fmt, ...); +void xpt_cam_debug(const char *fmt, ...); -#define CAM_DEBUG_DEV(dev, flag, printfargs) \ - if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ - && (cam_dpath != NULL) \ - && (xpt_path_comp_dev(cam_dpath, dev) >= 0) \ - && (xpt_path_comp_dev(cam_dpath, dev) < 2)) { \ - xpt_print_device(dev); \ - printf printfargs; \ - if (cam_debug_delay != 0) \ - DELAY(cam_debug_delay); \ +/* Stupid macro to remove a layer of parens */ +#define _CAM_X(...) __VA_ARGS__ + +/* Debugging macros. */ +#define CAM_DEBUGGED(path, flag) \ + (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ + && (cam_dpath != NULL) \ + && (xpt_path_comp(cam_dpath, (path)) >= 0) \ + && (xpt_path_comp(cam_dpath, (path)) < 2)) + +#define CAM_DEBUG(path, flag, printfargs) \ + if (CAM_DEBUGGED(path, flag)) { \ + xpt_cam_path_debug(path, _CAM_X printfargs); \ } -#define CAM_DEBUG_PRINT(flag, printfargs) \ - if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ - printf("cam_debug: "); \ - printf printfargs; \ - if (cam_debug_delay != 0) \ - DELAY(cam_debug_delay); \ +#define CAM_DEBUG_DEV(dev, flag, printfargs) \ + if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags) \ + && (cam_dpath != NULL) \ + && (xpt_path_comp_dev(cam_dpath, (dev)) >= 0) \ + && (xpt_path_comp_dev(cam_dpath, (dev)) < 2)) { \ + xpt_cam_dev_debug(dev, _CAM_X printfargs); \ } -#define CAM_DEBUG_PATH_PRINT(flag, path, printfargs) \ - if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ - xpt_print(path, "cam_debug: "); \ - printf printfargs; \ - if (cam_debug_delay != 0) \ - DELAY(cam_debug_delay); \ +#define CAM_DEBUG_PRINT(flag, printfargs) \ + if (((flag) & (CAM_DEBUG_COMPILE) & cam_dflags)) { \ + xpt_cam_debug(_CAM_X printfargs); \ } #else /* !_KERNEL */ #define CAM_DEBUGGED(A, B) 0 #define CAM_DEBUG(A, B, C) +#define CAM_DEBUG_DEV(A, B, C) #define CAM_DEBUG_PRINT(A, B) -#define CAM_DEBUG_PATH_PRINT(A, B, C) #endif /* _KERNEL */ diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index c32cad2433b1..a1dec7a8a674 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -3712,18 +3712,18 @@ xpt_print_path(struct cam_path *path) sbuf_delete(&sb); } -void -xpt_print_device(struct cam_ed *device) +static void +xpt_device_sbuf(struct cam_ed *device, struct sbuf *sb) { - if (device == NULL) - printf("(nopath): "); + sbuf_printf(sb, "(nopath): "); else { - printf("(noperiph:%s%d:%d:%d:%jx): ", device->sim->sim_name, - device->sim->unit_number, - device->sim->bus_id, - device->target->target_id, - (uintmax_t)device->lun_id); + sbuf_printf(sb, "(noperiph:%s%d:%d:%d:%jx): ", + device->sim->sim_name, + device->sim->unit_number, + device->sim->bus_id, + device->target->target_id, + (uintmax_t)device->lun_id); } } @@ -5543,3 +5543,60 @@ xpt_action_name(uint32_t action) snprintf(buffer, sizeof(buffer), "%#x", action); return (buffer); } + +void +xpt_cam_path_debug(struct cam_path *path, const char *fmt, ...) +{ + struct sbuf sbuf; + char buf[XPT_PRINT_LEN]; /* balance to not eat too much stack */ + struct sbuf *sb = sbuf_new(&sbuf, buf, sizeof(buf), SBUF_FIXEDLEN); + va_list ap; + + sbuf_set_drain(sb, sbuf_printf_drain, NULL); + xpt_path_sbuf(path, sb); + va_start(ap, fmt); + sbuf_vprintf(sb, fmt, ap); + va_end(ap); + sbuf_finish(sb); + sbuf_delete(sb); + if (cam_debug_delay != 0) + DELAY(cam_debug_delay); +} + +void +xpt_cam_dev_debug(struct cam_ed *dev, const char *fmt, ...) +{ + struct sbuf sbuf; + char buf[XPT_PRINT_LEN]; /* balance to not eat too much stack */ + struct sbuf *sb = sbuf_new(&sbuf, buf, sizeof(buf), SBUF_FIXEDLEN); + va_list ap; + + sbuf_set_drain(sb, sbuf_printf_drain, NULL); + xpt_device_sbuf(dev, sb); + va_start(ap, fmt); + sbuf_vprintf(sb, fmt, ap); + va_end(ap); + sbuf_finish(sb); + sbuf_delete(sb); + if (cam_debug_delay != 0) + DELAY(cam_debug_delay); +} + +void +xpt_cam_debug(const char *fmt, ...) +{ + struct sbuf sbuf; + char buf[XPT_PRINT_LEN]; /* balance to not eat too much stack */ + struct sbuf *sb = sbuf_new(&sbuf, buf, sizeof(buf), SBUF_FIXEDLEN); + va_list ap; + + sbuf_set_drain(sb, sbuf_printf_drain, NULL); + sbuf_printf(sb, "cam_debug: "); + va_start(ap, fmt); + sbuf_vprintf(sb, fmt, ap); + va_end(ap); + sbuf_finish(sb); + sbuf_delete(sb); + if (cam_debug_delay != 0) + DELAY(cam_debug_delay); +} diff --git a/sys/cam/cam_xpt.h b/sys/cam/cam_xpt.h index 1276dd7b9b2e..3c8d385fe33b 100644 --- a/sys/cam/cam_xpt.h +++ b/sys/cam/cam_xpt.h @@ -33,16 +33,15 @@ #define _CAM_CAM_XPT_H 1 #ifdef _KERNEL -#include #include #endif +#include /* Forward Declarations */ union ccb; struct cam_periph; struct cam_ed; struct cam_sim; -struct sbuf; /* * Definition of a CAM path. Paths are created from bus, target, and lun ids @@ -113,7 +112,6 @@ struct cam_sim *xpt_path_sim(struct cam_path *path); struct cam_periph *xpt_path_periph(struct cam_path *path); device_t xpt_path_sim_device(const struct cam_path *path); void xpt_print_path(struct cam_path *path); -void xpt_print_device(struct cam_ed *device); void xpt_print(struct cam_path *path, const char *fmt, ...); void xpt_async(uint32_t async_code, struct cam_path *path, void *async_arg);