Commit 2f72c759 authored by Johannes Berg's avatar Johannes Berg

wifi: iwlwifi: dbg-tlv: avoid extra allocation/copy

In iwl_dbg_tlv_alloc_trigger() the code makes a copy just
to modify it and pass it to another function to make a copy
again. Change the API to return the copy so the adjustment
can be done without another copy.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Reviewed-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240128084842.075c8b9f7030.Id5a61e1a87a9c6932727fb4e2c9b54ed6070362a@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 8a41c017
...@@ -64,7 +64,8 @@ dbg_ver_table[IWL_DBG_TLV_TYPE_NUM] = { ...@@ -64,7 +64,8 @@ dbg_ver_table[IWL_DBG_TLV_TYPE_NUM] = {
[IWL_DBG_TLV_TYPE_CONF_SET] = {.min_ver = 1, .max_ver = 1,}, [IWL_DBG_TLV_TYPE_CONF_SET] = {.min_ver = 1, .max_ver = 1,},
}; };
static int iwl_dbg_tlv_add(const struct iwl_ucode_tlv *tlv, /* add a new TLV node, returning it so it can be modified */
static struct iwl_ucode_tlv *iwl_dbg_tlv_add(const struct iwl_ucode_tlv *tlv,
struct list_head *list) struct list_head *list)
{ {
u32 len = le32_to_cpu(tlv->length); u32 len = le32_to_cpu(tlv->length);
...@@ -72,13 +73,13 @@ static int iwl_dbg_tlv_add(const struct iwl_ucode_tlv *tlv, ...@@ -72,13 +73,13 @@ static int iwl_dbg_tlv_add(const struct iwl_ucode_tlv *tlv,
node = kzalloc(sizeof(*node) + len, GFP_KERNEL); node = kzalloc(sizeof(*node) + len, GFP_KERNEL);
if (!node) if (!node)
return -ENOMEM; return NULL;
memcpy(&node->tlv, tlv, sizeof(node->tlv)); memcpy(&node->tlv, tlv, sizeof(node->tlv));
memcpy(node->tlv.data, tlv->data, len); memcpy(node->tlv.data, tlv->data, len);
list_add_tail(&node->list, list); list_add_tail(&node->list, list);
return 0; return &node->tlv;
} }
static bool iwl_dbg_tlv_ver_support(const struct iwl_ucode_tlv *tlv) static bool iwl_dbg_tlv_ver_support(const struct iwl_ucode_tlv *tlv)
...@@ -106,7 +107,9 @@ static int iwl_dbg_tlv_alloc_debug_info(struct iwl_trans *trans, ...@@ -106,7 +107,9 @@ static int iwl_dbg_tlv_alloc_debug_info(struct iwl_trans *trans,
IWL_DEBUG_FW(trans, "WRT: Loading debug cfg: %s\n", IWL_DEBUG_FW(trans, "WRT: Loading debug cfg: %s\n",
debug_info->debug_cfg_name); debug_info->debug_cfg_name);
return iwl_dbg_tlv_add(tlv, &trans->dbg.debug_info_tlv_list); if (!iwl_dbg_tlv_add(tlv, &trans->dbg.debug_info_tlv_list))
return -ENOMEM;
return 0;
} }
static int iwl_dbg_tlv_alloc_buf_alloc(struct iwl_trans *trans, static int iwl_dbg_tlv_alloc_buf_alloc(struct iwl_trans *trans,
...@@ -175,7 +178,9 @@ static int iwl_dbg_tlv_alloc_hcmd(struct iwl_trans *trans, ...@@ -175,7 +178,9 @@ static int iwl_dbg_tlv_alloc_hcmd(struct iwl_trans *trans,
return -EINVAL; return -EINVAL;
} }
return iwl_dbg_tlv_add(tlv, &trans->dbg.time_point[tp].hcmd_list); if (!iwl_dbg_tlv_add(tlv, &trans->dbg.time_point[tp].hcmd_list))
return -ENOMEM;
return 0;
} }
static int iwl_dbg_tlv_alloc_region(struct iwl_trans *trans, static int iwl_dbg_tlv_alloc_region(struct iwl_trans *trans,
...@@ -246,11 +251,9 @@ static int iwl_dbg_tlv_alloc_trigger(struct iwl_trans *trans, ...@@ -246,11 +251,9 @@ static int iwl_dbg_tlv_alloc_trigger(struct iwl_trans *trans,
const struct iwl_ucode_tlv *tlv) const struct iwl_ucode_tlv *tlv)
{ {
const struct iwl_fw_ini_trigger_tlv *trig = (const void *)tlv->data; const struct iwl_fw_ini_trigger_tlv *trig = (const void *)tlv->data;
struct iwl_fw_ini_trigger_tlv *dup_trig;
u32 tp = le32_to_cpu(trig->time_point); u32 tp = le32_to_cpu(trig->time_point);
u32 rf = le32_to_cpu(trig->reset_fw); u32 rf = le32_to_cpu(trig->reset_fw);
struct iwl_ucode_tlv *dup = NULL; struct iwl_ucode_tlv *new_tlv;
int ret;
if (le32_to_cpu(tlv->length) < sizeof(*trig)) if (le32_to_cpu(tlv->length) < sizeof(*trig))
return -EINVAL; return -EINVAL;
...@@ -267,20 +270,18 @@ static int iwl_dbg_tlv_alloc_trigger(struct iwl_trans *trans, ...@@ -267,20 +270,18 @@ static int iwl_dbg_tlv_alloc_trigger(struct iwl_trans *trans,
"WRT: time point %u for trigger TLV with reset_fw %u\n", "WRT: time point %u for trigger TLV with reset_fw %u\n",
tp, rf); tp, rf);
trans->dbg.last_tp_resetfw = 0xFF; trans->dbg.last_tp_resetfw = 0xFF;
if (!le32_to_cpu(trig->occurrences)) {
dup = kmemdup(tlv, sizeof(*tlv) + le32_to_cpu(tlv->length), new_tlv = iwl_dbg_tlv_add(tlv, &trans->dbg.time_point[tp].trig_list);
GFP_KERNEL); if (!new_tlv)
if (!dup)
return -ENOMEM; return -ENOMEM;
dup_trig = (void *)dup->data;
dup_trig->occurrences = cpu_to_le32(-1);
tlv = dup;
}
ret = iwl_dbg_tlv_add(tlv, &trans->dbg.time_point[tp].trig_list); if (!le32_to_cpu(trig->occurrences)) {
kfree(dup); struct iwl_fw_ini_trigger_tlv *new_trig = (void *)new_tlv->data;
return ret; new_trig->occurrences = cpu_to_le32(-1);
}
return 0;
} }
static int iwl_dbg_tlv_config_set(struct iwl_trans *trans, static int iwl_dbg_tlv_config_set(struct iwl_trans *trans,
...@@ -304,7 +305,9 @@ static int iwl_dbg_tlv_config_set(struct iwl_trans *trans, ...@@ -304,7 +305,9 @@ static int iwl_dbg_tlv_config_set(struct iwl_trans *trans,
return -EINVAL; return -EINVAL;
} }
return iwl_dbg_tlv_add(tlv, &trans->dbg.time_point[tp].config_list); if (!iwl_dbg_tlv_add(tlv, &trans->dbg.time_point[tp].config_list))
return -ENOMEM;
return 0;
} }
static int (*dbg_tlv_alloc[])(struct iwl_trans *trans, static int (*dbg_tlv_alloc[])(struct iwl_trans *trans,
...@@ -1148,7 +1151,9 @@ iwl_dbg_tlv_add_active_trigger(struct iwl_fw_runtime *fwrt, ...@@ -1148,7 +1151,9 @@ iwl_dbg_tlv_add_active_trigger(struct iwl_fw_runtime *fwrt,
if (!match) { if (!match) {
IWL_DEBUG_FW(fwrt, "WRT: Enabling trigger (time point %u)\n", IWL_DEBUG_FW(fwrt, "WRT: Enabling trigger (time point %u)\n",
le32_to_cpu(trig->time_point)); le32_to_cpu(trig->time_point));
return iwl_dbg_tlv_add(trig_tlv, trig_list); if (!iwl_dbg_tlv_add(trig_tlv, trig_list))
return -ENOMEM;
return 0;
} }
return iwl_dbg_tlv_override_trig_node(fwrt, trig_tlv, match); return iwl_dbg_tlv_override_trig_node(fwrt, trig_tlv, match);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment