iflib: mark isc_driver_version as constant

From Jake:
The iflib core never modifies the isc_driver_version string. Allow
drivers to safely assign pointers to constant buffers by marking this
parameter const.

Submitted by:	Jacob Keller <jacob.e.keller@intel.com>
Reviewed by:	erj@, gallatin@, jhb@
MFC after:	1 week
Sponsored by:	Intel Corporation
Differential Revision:	https://reviews.freebsd.org/D19577
This commit is contained in:
Eric Joyner 2019-03-19 23:44:26 +00:00
parent 312437815a
commit 10a1e981d4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=345312
4 changed files with 42 additions and 3 deletions

View File

@ -48,6 +48,7 @@
.Nm SYSCTL_ADD_SBINTIME_MSEC , .Nm SYSCTL_ADD_SBINTIME_MSEC ,
.Nm SYSCTL_ADD_SBINTIME_USEC , .Nm SYSCTL_ADD_SBINTIME_USEC ,
.Nm SYSCTL_ADD_STRING , .Nm SYSCTL_ADD_STRING ,
.Nm SYSCTL_ADD_CONST_STRING ,
.Nm SYSCTL_ADD_STRUCT , .Nm SYSCTL_ADD_STRUCT ,
.Nm SYSCTL_ADD_U8 , .Nm SYSCTL_ADD_U8 ,
.Nm SYSCTL_ADD_U16 , .Nm SYSCTL_ADD_U16 ,
@ -82,6 +83,7 @@
.Nm SYSCTL_SBINTIME_MSEC , .Nm SYSCTL_SBINTIME_MSEC ,
.Nm SYSCTL_SBINTIME_USEC , .Nm SYSCTL_SBINTIME_USEC ,
.Nm SYSCTL_STRING , .Nm SYSCTL_STRING ,
.Nm SYSCTL_CONST_STRING ,
.Nm SYSCTL_STRUCT , .Nm SYSCTL_STRUCT ,
.Nm SYSCTL_U8 , .Nm SYSCTL_U8 ,
.Nm SYSCTL_U16 , .Nm SYSCTL_U16 ,
@ -291,6 +293,16 @@
.Fa "const char *descr" .Fa "const char *descr"
.Fc .Fc
.Ft struct sysctl_oid * .Ft struct sysctl_oid *
.Fo SYSCTL_ADD_CONST_STRING
.Fa "struct sysctl_ctx_list *ctx"
.Fa "struct sysctl_oid_list *parent"
.Fa "int number"
.Fa "const char *name"
.Fa "int ctlflags"
.Fa "const char *ptr"
.Fa "const char *descr"
.Fc
.Ft struct sysctl_oid *
.Fo SYSCTL_ADD_STRUCT .Fo SYSCTL_ADD_STRUCT
.Fa "struct sysctl_ctx_list *ctx" .Fa "struct sysctl_ctx_list *ctx"
.Fa "struct sysctl_oid_list *parent" .Fa "struct sysctl_oid_list *parent"
@ -443,6 +455,7 @@
.Fn SYSCTL_SBINTIME_MSEC parent number name ctlflags ptr descr .Fn SYSCTL_SBINTIME_MSEC parent number name ctlflags ptr descr
.Fn SYSCTL_SBINTIME_USEC parent number name ctlflags ptr descr .Fn SYSCTL_SBINTIME_USEC parent number name ctlflags ptr descr
.Fn SYSCTL_STRING parent number name ctlflags arg len descr .Fn SYSCTL_STRING parent number name ctlflags arg len descr
.Fn SYSCTL_CONST_STRING parent number name ctlflags arg descr
.Fn SYSCTL_STRUCT parent number name ctlflags ptr struct_type descr .Fn SYSCTL_STRUCT parent number name ctlflags ptr struct_type descr
.Fn SYSCTL_U8 parent number name ctlflags ptr val descr .Fn SYSCTL_U8 parent number name ctlflags ptr val descr
.Fn SYSCTL_U16 parent number name ctlflags ptr val descr .Fn SYSCTL_U16 parent number name ctlflags ptr val descr
@ -607,6 +620,11 @@ If the
.Fa len .Fa len
argument in zero, the string length is computed at every access to the OID using argument in zero, the string length is computed at every access to the OID using
.Xr strlen 3 . .Xr strlen 3 .
Use the
.Fn SYSCTL_CONST_STRING
macro or the
.Fn SYSCTL_ADD_CONST_STRING
function to add a sysctl for a constant string.
.Sh CREATING OPAQUE SYSCTLS .Sh CREATING OPAQUE SYSCTLS
The The
.Fn SYSCTL_OPAQUE .Fn SYSCTL_OPAQUE
@ -658,6 +676,7 @@ Static sysctls are declared using one of the
.Fn SYSCTL_SBINTIME_MSEC , .Fn SYSCTL_SBINTIME_MSEC ,
.Fn SYSCTL_SBINTIME_USEC , .Fn SYSCTL_SBINTIME_USEC ,
.Fn SYSCTL_STRING , .Fn SYSCTL_STRING ,
.Fn SYSCTL_CONST_STRING ,
.Fn SYSCTL_STRUCT , .Fn SYSCTL_STRUCT ,
.Fn SYSCTL_U8 , .Fn SYSCTL_U8 ,
.Fn SYSCTL_U16 , .Fn SYSCTL_U16 ,
@ -690,6 +709,7 @@ Dynamic nodes are created using one of the
.Fn SYSCTL_ADD_SBINTIME_MSEC , .Fn SYSCTL_ADD_SBINTIME_MSEC ,
.Fn SYSCTL_ADD_SBINTIME_USEC , .Fn SYSCTL_ADD_SBINTIME_USEC ,
.Fn SYSCTL_ADD_STRING , .Fn SYSCTL_ADD_STRING ,
.Fn SYSCTL_ADD_CONST_STRING ,
.Fn SYSCTL_ADD_STRUCT , .Fn SYSCTL_ADD_STRUCT ,
.Fn SYSCTL_ADD_U8 , .Fn SYSCTL_ADD_U8 ,
.Fn SYSCTL_ADD_U16 , .Fn SYSCTL_ADD_U16 ,

View File

@ -6257,8 +6257,8 @@ iflib_add_device_sysctl_pre(if_ctx_t ctx)
CTLFLAG_RD, NULL, "IFLIB fields"); CTLFLAG_RD, NULL, "IFLIB fields");
oid_list = SYSCTL_CHILDREN(node); oid_list = SYSCTL_CHILDREN(node);
SYSCTL_ADD_STRING(ctx_list, oid_list, OID_AUTO, "driver_version", SYSCTL_ADD_CONST_STRING(ctx_list, oid_list, OID_AUTO, "driver_version",
CTLFLAG_RD, ctx->ifc_sctx->isc_driver_version, 0, CTLFLAG_RD, ctx->ifc_sctx->isc_driver_version,
"driver version"); "driver version");
SYSCTL_ADD_U16(ctx_list, oid_list, OID_AUTO, "override_ntxqs", SYSCTL_ADD_U16(ctx_list, oid_list, OID_AUTO, "override_ntxqs",

View File

@ -248,7 +248,7 @@ struct if_shared_ctx {
/* fields necessary for probe */ /* fields necessary for probe */
pci_vendor_info_t *isc_vendor_info; pci_vendor_info_t *isc_vendor_info;
char *isc_driver_version; const char *isc_driver_version;
/* optional function to transform the read values to match the table*/ /* optional function to transform the read values to match the table*/
void (*isc_parse_devinfo) (uint16_t *device_id, uint16_t *subvendor_id, void (*isc_parse_devinfo) (uint16_t *device_id, uint16_t *subvendor_id,
uint16_t *subdevice_id, uint16_t *rev_id); uint16_t *subdevice_id, uint16_t *rev_id);

View File

@ -354,6 +354,25 @@ TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry);
NULL); \ NULL); \
}) })
/* Oid for a constant '\0' terminated string. */
#define SYSCTL_CONST_STRING(parent, nbr, name, access, arg, descr) \
SYSCTL_OID(parent, nbr, name, CTLTYPE_STRING|(access), \
__DECONST(char *, arg), 0, sysctl_handle_string, "A", descr); \
CTASSERT(!(access & CTLFLAG_WR)); \
CTASSERT(((access) & CTLTYPE) == 0 || \
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_STRING)
#define SYSCTL_ADD_CONST_STRING(ctx, parent, nbr, name, access, arg, descr) \
({ \
char *__arg = __DECONST(char *, arg); \
CTASSERT(!(access & CTLFLAG_WR)); \
CTASSERT(((access) & CTLTYPE) == 0 || \
((access) & SYSCTL_CT_ASSERT_MASK) == CTLTYPE_STRING); \
sysctl_add_oid(ctx, parent, nbr, name, CTLTYPE_STRING|(access), \
__arg, 0, sysctl_handle_string, "A", __DESCR(descr), \
NULL); \
})
/* Oid for a bool. If ptr is NULL, val is returned. */ /* Oid for a bool. If ptr is NULL, val is returned. */
#define SYSCTL_NULL_BOOL_PTR ((bool *)NULL) #define SYSCTL_NULL_BOOL_PTR ((bool *)NULL)
#define SYSCTL_BOOL(parent, nbr, name, access, ptr, val, descr) \ #define SYSCTL_BOOL(parent, nbr, name, access, ptr, val, descr) \