On 09-Oct-20 5:51 PM, Ananyev, Konstantin wrote:
+case RTE_POWER_MGMT_TYPE_PAUSE:
+rte_eth_remove_rx_callback(port_id, queue_id,
+ queue_cfg->cur_cb);
+break;
+case RTE_POWER_MGMT_TYPE_SCALE:
+rte_power_freq_max(lcore_id);
+rte_eth_remove_rx_callback(port_id, queue_id,
+ queue_cfg->cur_cb);
+rte_power_exit(lcore_id);
+break;
+}
+/* it's not recommend to free callback instance here.
+ * it cause memory leak which is a known issue.
+ */
+queue_cfg->cur_cb = NULL;
+queue_cfg->pwr_mgmt_state = PMD_MGMT_DISABLED;
+port_cfg[port_id].ref_cnt--;
+
+if (port_cfg[port_id].ref_cnt == 0) {
+rte_free(port_cfg[port_id].queue_cfg);
It is not safe to do so, unless device is already stopped.
Otherwise you need some sync mechanism here (hand-made as bpf lib, or rcu
online/offline, or...)
Not sure what you mean. We're not freeing the callback structure, we're
freeing the local data structure holding the per-port status.
What is the difference?
You still trying to free memory that might be used by your DP thread
that still executes the callback.
Welp, you're right :/ I'll see what i can do to fix it.
--
Thanks,
Anatoly