cam: kern.cam.max_high_power tuneable / sysctl

Create a tunable for the maxinum number of 'high power' commands to
schedule, kern.cam.max_high_power.  Default remains at 4.

Differential Revision:	https://reviews.freebsd.org/D56462
This commit is contained in:
Scott Long
2026-04-24 12:31:29 -06:00
committed by Warner Losh
parent 334adacbc1
commit cb78764d47
+8 -2
View File
@@ -86,8 +86,8 @@ SDT_PROBE_DEFINE4(cam, , xpt, async__cb, "void *", "uint32_t",
_Static_assert(XPT_PRINT_LEN <= XPT_PRINT_MAXLEN, "XPT_PRINT_LEN is too large"); _Static_assert(XPT_PRINT_LEN <= XPT_PRINT_MAXLEN, "XPT_PRINT_LEN is too large");
/* /*
* This is the maximum number of high powered commands (e.g. start unit) * This sets a default for the the maximum number of high powered commands
* that can be outstanding at a particular time. * (e.g. start unit) that can be outstanding at a particular time.
*/ */
#ifndef CAM_MAX_HIGHPOWER #ifndef CAM_MAX_HIGHPOWER
#define CAM_MAX_HIGHPOWER 4 #define CAM_MAX_HIGHPOWER 4
@@ -168,6 +168,9 @@ SYSCTL_INT(_kern_cam, OID_AUTO, boot_delay, CTLFLAG_RDTUN,
&xsoftc.boot_delay, 0, "Bus registration wait time"); &xsoftc.boot_delay, 0, "Bus registration wait time");
SYSCTL_UINT(_kern_cam, OID_AUTO, xpt_generation, CTLFLAG_RD, SYSCTL_UINT(_kern_cam, OID_AUTO, xpt_generation, CTLFLAG_RD,
&xsoftc.xpt_generation, 0, "CAM peripheral generation count"); &xsoftc.xpt_generation, 0, "CAM peripheral generation count");
SYSCTL_INT(_kern_cam, OID_AUTO, max_high_power, CTLFLAG_RWTUN,
&xsoftc.num_highpower, 0,
"Max number of high power commands to be issued at once");
struct cam_doneq { struct cam_doneq {
struct mtx_padalign cam_doneq_mtx; struct mtx_padalign cam_doneq_mtx;
@@ -892,6 +895,9 @@ xpt_init(void *dummy)
TAILQ_INIT(&xsoftc.xpt_busses); TAILQ_INIT(&xsoftc.xpt_busses);
TAILQ_INIT(&xsoftc.ccb_scanq); TAILQ_INIT(&xsoftc.ccb_scanq);
STAILQ_INIT(&xsoftc.highpowerq); STAILQ_INIT(&xsoftc.highpowerq);
/* Fall back to a default if the kenv tunable isn't set */
if (xsoftc.num_highpower == 0)
xsoftc.num_highpower = CAM_MAX_HIGHPOWER; xsoftc.num_highpower = CAM_MAX_HIGHPOWER;
mtx_init(&xsoftc.xpt_highpower_lock, "XPT highpower lock", NULL, MTX_DEF); mtx_init(&xsoftc.xpt_highpower_lock, "XPT highpower lock", NULL, MTX_DEF);