[PATCH v6 15/19] treewide: Replace some uses of str_has_prefix() by strprefix()
From: Alejandro Colomar
Date: Sat Nov 14 2026 - 10:24:04 EST
In many cases, it results in simpler code. For example:
- prefix_len = str_has_prefix(name, PDSC_FW_COMPONENT_PREFIX);
- if (prefix_len)
- name += prefix_len;
+ name = strprefix(name, PDSC_FW_COMPONENT_PREFIX) ?: name;
It avoids explicit pointer arithmetic, which also prevents certain bugs.
After this commit, only a few uses of str_has_prefix() remain. Those
are difficult to remove, as the surrounding code is deeply based on
lengths. Let's leave those, as it's too risky to touch that code.
Signed-off-by: Alejandro Colomar <alx@xxxxxxxxxx>
---
drivers/net/ethernet/amd/pds_core/fw.c | 5 +--
kernel/printk/braille.c | 14 ++++----
kernel/trace/trace.c | 9 +++---
kernel/trace/trace_events.c | 3 +-
kernel/trace/trace_events_hist.c | 44 ++++++++++++--------------
kernel/trace/trace_events_synth.c | 8 +++--
kernel/trace/trace_stack.c | 6 ++--
7 files changed, 42 insertions(+), 47 deletions(-)
diff --git a/drivers/net/ethernet/amd/pds_core/fw.c b/drivers/net/ethernet/amd/pds_core/fw.c
index 7fe4594e9f9b..3f0b1137dd90 100644
--- a/drivers/net/ethernet/amd/pds_core/fw.c
+++ b/drivers/net/ethernet/amd/pds_core/fw.c
@@ -50,16 +50,13 @@ void pdsc_fw_components_invalidate(struct pdsc *pdsc)
static u8 pdsc_name_to_fw_type(const char *name)
{
- size_t prefix_len;
int i;
/* "fw" without suffix maps to main firmware */
if (!strcmp(name, "fw"))
return PDS_CORE_FW_TYPE_MAIN;
- prefix_len = str_has_prefix(name, PDSC_FW_COMPONENT_PREFIX);
- if (prefix_len)
- name += prefix_len;
+ name = strprefix(name, PDSC_FW_COMPONENT_PREFIX) ?: name;
for (i = 1; i < ARRAY_SIZE(pdsc_fw_type_names); i++) {
if (pdsc_fw_type_names[i] &&
diff --git a/kernel/printk/braille.c b/kernel/printk/braille.c
index 17a9591e54ff..18847d88140b 100644
--- a/kernel/printk/braille.c
+++ b/kernel/printk/braille.c
@@ -11,18 +11,18 @@
int _braille_console_setup(char **str, char **brl_options)
{
- size_t len;
+ char *p;
- len = str_has_prefix(*str, "brl,");
- if (len) {
+ p = strprefix(*str, "brl,");
+ if (p) {
*brl_options = "";
- *str += len;
+ *str = p;
return 0;
}
- len = str_has_prefix(*str, "brl=");
- if (len) {
- *brl_options = *str + len;
+ p = strprefix(*str, "brl=");
+ if (p) {
+ *brl_options = p;
*str = strchr(*brl_options, ',');
if (!*str) {
pr_err("need port name after brl=\n");
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index e8c4efa8107b..1c40a00c5bd7 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -4085,19 +4085,18 @@ int set_tracer_flag(struct trace_array *tr, u64 mask, int enabled)
int trace_set_options(struct trace_array *tr, char *option)
{
- char *cmp;
+ char *cmp, *p;
int neg = 0;
int ret;
size_t orig_len = strlen(option);
- int len;
cmp = strstrip(option);
- len = str_has_prefix(cmp, "no");
- if (len)
+ p = strprefix(cmp, "no");
+ if (p)
neg = 1;
- cmp += len;
+ cmp = p;
mutex_lock(&event_mutex);
mutex_lock(&trace_types_lock);
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index d467cdf9c805..72e42def1dd0 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -266,9 +266,8 @@ static struct trace_event_fields *find_event_field(const char *fmt,
const char *p = fmt;
int len;
- if (!(len = str_has_prefix(fmt, "REC->")))
+ if (!(fmt = strprefix(fmt, "REC->")))
return NULL;
- fmt += len;
for (p = fmt; *p; p++) {
if (!isalnum(*p) && *p != '_')
break;
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index c099bfbb9fb6..d5578b67ce9f 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -1485,25 +1485,26 @@ static int parse_action(char *str, struct hist_trigger_attrs *attrs)
static int parse_assignment(struct trace_array *tr,
char *str, struct hist_trigger_attrs *attrs)
{
- int len, ret = 0;
+ char *p;
+ int ret = 0;
- if ((len = str_has_prefix(str, "key=")) ||
- (len = str_has_prefix(str, "keys="))) {
- attrs->keys_str = kstrdup(str + len, GFP_KERNEL);
+ if ((p = strprefix(str, "key=")) ||
+ (p = strprefix(str, "keys="))) {
+ attrs->keys_str = kstrdup(p, GFP_KERNEL);
if (!attrs->keys_str) {
ret = -ENOMEM;
goto out;
}
- } else if ((len = str_has_prefix(str, "val=")) ||
- (len = str_has_prefix(str, "vals=")) ||
- (len = str_has_prefix(str, "values="))) {
- attrs->vals_str = kstrdup(str + len, GFP_KERNEL);
+ } else if ((p = strprefix(str, "val=")) ||
+ (p = strprefix(str, "vals=")) ||
+ (p = strprefix(str, "values="))) {
+ attrs->vals_str = kstrdup(p, GFP_KERNEL);
if (!attrs->vals_str) {
ret = -ENOMEM;
goto out;
}
- } else if ((len = str_has_prefix(str, "sort="))) {
- attrs->sort_key_str = kstrdup(str + len, GFP_KERNEL);
+ } else if ((p = strprefix(str, "sort="))) {
+ attrs->sort_key_str = kstrdup(p, GFP_KERNEL);
if (!attrs->sort_key_str) {
ret = -ENOMEM;
goto out;
@@ -1514,17 +1515,15 @@ static int parse_assignment(struct trace_array *tr,
ret = -ENOMEM;
goto out;
}
- } else if ((len = str_has_prefix(str, "clock="))) {
- str += len;
-
- str = strstrip(str);
- attrs->clock = kstrdup(str, GFP_KERNEL);
+ } else if ((p = strprefix(str, "clock="))) {
+ p = strstrip(p);
+ attrs->clock = kstrdup(p, GFP_KERNEL);
if (!attrs->clock) {
ret = -ENOMEM;
goto out;
}
- } else if ((len = str_has_prefix(str, "size="))) {
- int map_bits = parse_map_size(str + len);
+ } else if ((p = strprefix(str, "size="))) {
+ int map_bits = parse_map_size(p);
if (map_bits < 0) {
ret = map_bits;
@@ -4881,8 +4880,7 @@ static int parse_actions(struct hist_trigger_data *hist_data)
struct action_data *data;
unsigned int i;
int ret = 0;
- char *str;
- int len;
+ char *str, *p;
for (i = 0; i < hist_data->attrs->n_actions; i++) {
enum handler_id hid = 0;
@@ -4890,14 +4888,14 @@ static int parse_actions(struct hist_trigger_data *hist_data)
str = hist_data->attrs->action_str[i];
- if ((len = str_has_prefix(str, "onmatch(")))
+ if ((p = strprefix(str, "onmatch(")))
hid = HANDLER_ONMATCH;
- else if ((len = str_has_prefix(str, "onmax(")))
+ else if ((p = strprefix(str, "onmax(")))
hid = HANDLER_ONMAX;
- else if ((len = str_has_prefix(str, "onchange(")))
+ else if ((p = strprefix(str, "onchange(")))
hid = HANDLER_ONCHANGE;
- action_str = str + len;
+ action_str = p ?: str;
switch (hid) {
case HANDLER_ONMATCH:
diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c
index 016ca522e5af..2a7df262aa8f 100644
--- a/kernel/trace/trace_events_synth.c
+++ b/kernel/trace/trace_events_synth.c
@@ -2268,12 +2268,14 @@ static int create_synth_event(const char *raw_command)
/* This interface accepts group name prefix */
if (strchr(name, '/')) {
- len = str_has_prefix(name, SYNTH_SYSTEM "/");
- if (len == 0) {
+ const char *n;
+
+ n = strprefix(name, SYNTH_SYSTEM "/");
+ if (!n) {
synth_err(SYNTH_ERR_INVALID_DYN_CMD, 0);
return -EINVAL;
}
- name += len;
+ name = n;
}
len = name - raw_command;
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c
index e7f4e523587d..3f8ddb7b8530 100644
--- a/kernel/trace/trace_stack.c
+++ b/kernel/trace/trace_stack.c
@@ -539,10 +539,10 @@ static char stack_trace_filter_buf[COMMAND_LINE_SIZE+1] __initdata;
static __init int enable_stacktrace(char *str)
{
- int len;
+ char *p;
- if ((len = str_has_prefix(str, "_filter=")))
- strscpy(stack_trace_filter_buf, str + len);
+ if ((p = strprefix(str, "_filter=")))
+ strscpy(stack_trace_filter_buf, p);
stack_tracer_enabled = 1;
return 1;
--
2.55.0
Attachment:
signature.asc
Description: PGP signature