|
@@ -9255,12 +9255,21 @@ static int __ipa3_alloc_counter_hdl
|
|
|
return id;
|
|
|
}
|
|
|
|
|
|
-int ipa3_alloc_counter_id(struct ipa_ioc_flt_rt_counter_alloc *counter)
|
|
|
+int ipa3_alloc_counter_id(struct ipa_ioc_flt_rt_counter_alloc *header)
|
|
|
{
|
|
|
int i, unused_cnt, unused_max, unused_start_id;
|
|
|
+ struct ipa_ioc_flt_rt_counter_alloc *counter;
|
|
|
+
|
|
|
+ counter = kmem_cache_zalloc(ipa3_ctx->fnr_stats_cache, GFP_KERNEL);
|
|
|
+ if (!counter) {
|
|
|
+ IPAERR_RL("failed to alloc fnr stats counter object\n");
|
|
|
+ spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
|
|
|
idr_preload(GFP_KERNEL);
|
|
|
spin_lock(&ipa3_ctx->flt_rt_counters.hdl_lock);
|
|
|
+ memcpy(counter, header, sizeof(struct ipa_ioc_flt_rt_counter_alloc));
|
|
|
|
|
|
/* allocate hw counters */
|
|
|
counter->hw_counter.start_id = 0;
|
|
@@ -9361,7 +9370,7 @@ mark_hw_cnt:
|
|
|
unused_start_id = counter->hw_counter.start_id;
|
|
|
if (unused_start_id < 1 ||
|
|
|
unused_start_id > IPA_FLT_RT_HW_COUNTER) {
|
|
|
- IPAERR("unexpected hw_counter start id %d\n",
|
|
|
+ IPAERR_RL("unexpected hw_counter start id %d\n",
|
|
|
unused_start_id);
|
|
|
goto err;
|
|
|
}
|
|
@@ -9376,7 +9385,7 @@ mark_sw_cnt:
|
|
|
- IPA_FLT_RT_HW_COUNTER;
|
|
|
if (unused_start_id < 1 ||
|
|
|
unused_start_id > IPA_FLT_RT_SW_COUNTER) {
|
|
|
- IPAERR("unexpected sw_counter start id %d\n",
|
|
|
+ IPAERR_RL("unexpected sw_counter start id %d\n",
|
|
|
unused_start_id);
|
|
|
goto err;
|
|
|
}
|
|
@@ -9388,10 +9397,12 @@ done:
|
|
|
counter->hdl = __ipa3_alloc_counter_hdl(counter);
|
|
|
spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
|
|
|
idr_preload_end();
|
|
|
+ memcpy(header, counter, sizeof(struct ipa_ioc_flt_rt_counter_alloc));
|
|
|
return 0;
|
|
|
|
|
|
err:
|
|
|
counter->hdl = -1;
|
|
|
+ kmem_cache_free(ipa3_ctx->fnr_stats_cache, counter);
|
|
|
spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
|
|
|
idr_preload_end();
|
|
|
return -ENOMEM;
|
|
@@ -9405,7 +9416,7 @@ void ipa3_counter_remove_hdl(int hdl)
|
|
|
spin_lock(&ipa3_ctx->flt_rt_counters.hdl_lock);
|
|
|
counter = idr_find(&ipa3_ctx->flt_rt_counters.hdl, hdl);
|
|
|
if (counter == NULL) {
|
|
|
- IPAERR("unexpected hdl %d\n", hdl);
|
|
|
+ IPAERR_RL("unexpected hdl %d\n", hdl);
|
|
|
goto err;
|
|
|
}
|
|
|
/* remove counters belong to this hdl, set used back to 0 */
|
|
@@ -9415,7 +9426,7 @@ void ipa3_counter_remove_hdl(int hdl)
|
|
|
memset(&ipa3_ctx->flt_rt_counters.used_hw + offset,
|
|
|
0, counter->hw_counter.num_counters * sizeof(bool));
|
|
|
} else {
|
|
|
- IPAERR("unexpected hdl %d\n", hdl);
|
|
|
+ IPAERR_RL("unexpected hdl %d\n", hdl);
|
|
|
goto err;
|
|
|
}
|
|
|
offset = counter->sw_counter.start_id - 1 - IPA_FLT_RT_HW_COUNTER;
|
|
@@ -9424,11 +9435,12 @@ void ipa3_counter_remove_hdl(int hdl)
|
|
|
memset(&ipa3_ctx->flt_rt_counters.used_sw + offset,
|
|
|
0, counter->sw_counter.num_counters * sizeof(bool));
|
|
|
} else {
|
|
|
- IPAERR("unexpected hdl %d\n", hdl);
|
|
|
+ IPAERR_RL("unexpected hdl %d\n", hdl);
|
|
|
goto err;
|
|
|
}
|
|
|
/* remove the handle */
|
|
|
idr_remove(&ipa3_ctx->flt_rt_counters.hdl, hdl);
|
|
|
+ kmem_cache_free(ipa3_ctx->fnr_stats_cache, counter);
|
|
|
err:
|
|
|
spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
|
|
|
}
|
|
@@ -9445,8 +9457,10 @@ void ipa3_counter_id_remove_all(void)
|
|
|
memset(&ipa3_ctx->flt_rt_counters.used_sw, 0,
|
|
|
sizeof(ipa3_ctx->flt_rt_counters.used_sw));
|
|
|
/* remove all handles */
|
|
|
- idr_for_each_entry(&ipa3_ctx->flt_rt_counters.hdl, counter, hdl)
|
|
|
+ idr_for_each_entry(&ipa3_ctx->flt_rt_counters.hdl, counter, hdl) {
|
|
|
idr_remove(&ipa3_ctx->flt_rt_counters.hdl, hdl);
|
|
|
+ kmem_cache_free(ipa3_ctx->fnr_stats_cache, counter);
|
|
|
+ }
|
|
|
spin_unlock(&ipa3_ctx->flt_rt_counters.hdl_lock);
|
|
|
}
|
|
|
|
|
@@ -10079,7 +10093,7 @@ u32 ipa3_get_num_pipes(void)
|
|
|
|
|
|
/**
|
|
|
* ipa3_disable_apps_wan_cons_deaggr()-
|
|
|
- * set ipa_ctx->ipa_client_apps_wan_cons_agg_gro
|
|
|
+ * set ipa3_ctx->ipa_client_apps_wan_cons_agg_gro
|
|
|
*
|
|
|
* Return value: 0 or negative in case of failure
|
|
|
*/
|