qcacmn: Mapping between NAPI budget and internal budget

There is a scale factor mapping between NAPI budget and internal
budget. Add logic for this dynamic translation.

CRs-Fixed: 2140049
Change-Id: Iac03bd431ab7a416a87e488b14bc8b5c1bb7869f
This commit is contained in:
chenguo
2017-11-08 16:33:25 +08:00
committed by snandini
parent 98b30de852
commit f254886c3d
4 changed files with 41 additions and 15 deletions

View File

@@ -1010,7 +1010,7 @@ static QDF_STATUS dp_soc_interrupt_attach(void *txrx_soc)
ret = hif_register_ext_group(soc->hif_handle, ret = hif_register_ext_group(soc->hif_handle,
num_irq, irq_id_map, dp_service_srngs, num_irq, irq_id_map, dp_service_srngs,
&soc->intr_ctx[i], "dp_intr", &soc->intr_ctx[i], "dp_intr",
HIF_EXEC_NAPI_TYPE, 2); HIF_EXEC_NAPI_TYPE, QCA_NAPI_DEF_SCALE_BIN_SHIFT);
if (ret) { if (ret) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,

View File

@@ -167,16 +167,20 @@ struct CE_state;
#ifndef NAPI_YIELD_BUDGET_BASED #ifndef NAPI_YIELD_BUDGET_BASED
#ifdef HIF_CONFIG_SLUB_DEBUG_ON #ifdef HIF_CONFIG_SLUB_DEBUG_ON
#define QCA_NAPI_BUDGET 64 #define QCA_NAPI_DEF_SCALE_BIN_SHIFT 1
#define QCA_NAPI_DEF_SCALE 2
#else /* PERF build */ #else /* PERF build */
#define QCA_NAPI_BUDGET 64 #ifdef CONFIG_WIN
#define QCA_NAPI_DEF_SCALE 16 #define QCA_NAPI_DEF_SCALE_BIN_SHIFT 1
#else
#define QCA_NAPI_DEF_SCALE_BIN_SHIFT 4
#endif /* CONFIG_WIN */
#endif /* SLUB_DEBUG_ON */ #endif /* SLUB_DEBUG_ON */
#else /* NAPI_YIELD_BUDGET_BASED */ #else /* NAPI_YIELD_BUDGET_BASED */
#define QCA_NAPI_DEF_SCALE_BIN_SHIFT 2
#endif /* NAPI_YIELD_BUDGET_BASED */
#define QCA_NAPI_BUDGET 64 #define QCA_NAPI_BUDGET 64
#define QCA_NAPI_DEF_SCALE 4 #define QCA_NAPI_DEF_SCALE \
#endif (1 << QCA_NAPI_DEF_SCALE_BIN_SHIFT)
#define HIF_NAPI_MAX_RECEIVES (QCA_NAPI_BUDGET * QCA_NAPI_DEF_SCALE) #define HIF_NAPI_MAX_RECEIVES (QCA_NAPI_BUDGET * QCA_NAPI_DEF_SCALE)
/* NOTE: "napi->scale" can be changed, /* NOTE: "napi->scale" can be changed,

View File

@@ -20,6 +20,15 @@
#include <ce_main.h> #include <ce_main.h>
#include <hif_irq_affinity.h> #include <hif_irq_affinity.h>
/* mapping NAPI budget 0 to internal budget 0
* NAPI budget 1 to internal budget [1,scaler -1]
* NAPI budget 2 to internal budget [scaler, 2 * scaler - 1], etc
*/
#define NAPI_BUDGET_TO_INTERNAL_BUDGET(n, s) \
(((n) << (s)) - 1)
#define INTERNAL_BUDGET_TO_NAPI_BUDGET(n, s) \
(((n) >> (s)) + 1)
static struct hif_exec_context *hif_exec_tasklet_create(void); static struct hif_exec_context *hif_exec_tasklet_create(void);
/** /**
@@ -102,11 +111,16 @@ static int hif_exec_poll(struct napi_struct *napi, int budget)
struct hif_exec_context *hif_ext_group = &exec_ctx->exec_ctx; struct hif_exec_context *hif_ext_group = &exec_ctx->exec_ctx;
struct hif_softc *scn = HIF_GET_SOFTC(hif_ext_group->hif); struct hif_softc *scn = HIF_GET_SOFTC(hif_ext_group->hif);
int work_done; int work_done;
int normalized_budget = 0;
int shift = hif_ext_group->scale_bin_shift;
int cpu = smp_processor_id(); int cpu = smp_processor_id();
work_done = hif_ext_group->handler(hif_ext_group->context, budget); if (budget)
normalized_budget = NAPI_BUDGET_TO_INTERNAL_BUDGET(budget, shift);
work_done = hif_ext_group->handler(hif_ext_group->context,
normalized_budget);
if (work_done < budget) { if (work_done < normalized_budget) {
napi_complete(napi); napi_complete(napi);
qdf_atomic_dec(&scn->active_grp_tasklet_cnt); qdf_atomic_dec(&scn->active_grp_tasklet_cnt);
hif_ext_group->irq_enable(hif_ext_group); hif_ext_group->irq_enable(hif_ext_group);
@@ -114,12 +128,16 @@ static int hif_exec_poll(struct napi_struct *napi, int budget)
} else { } else {
/* if the ext_group supports time based yield, claim full work /* if the ext_group supports time based yield, claim full work
* done anyways */ * done anyways */
work_done = budget; work_done = normalized_budget;
} }
hif_ext_group->stats[cpu].napi_polls++; hif_ext_group->stats[cpu].napi_polls++;
hif_ext_group->stats[cpu].napi_workdone += work_done; hif_ext_group->stats[cpu].napi_workdone += work_done;
/* map internal budget to NAPI budget */
if (work_done)
work_done = INTERNAL_BUDGET_TO_NAPI_BUDGET(work_done, shift);
return work_done; return work_done;
} }
@@ -163,8 +181,10 @@ struct hif_execution_ops napi_sched_ops = {
#ifdef FEATURE_NAPI #ifdef FEATURE_NAPI
/** /**
* hif_exec_napi_create() - allocate and initialize a napi exec context * hif_exec_napi_create() - allocate and initialize a napi exec context
* @scale: a binary shift factor to map NAPI budget from\to internal
* budget
*/ */
static struct hif_exec_context *hif_exec_napi_create(uint32_t budget) static struct hif_exec_context *hif_exec_napi_create(uint32_t scale)
{ {
struct hif_napi_exec_context *ctx; struct hif_napi_exec_context *ctx;
@@ -174,15 +194,16 @@ static struct hif_exec_context *hif_exec_napi_create(uint32_t budget)
ctx->exec_ctx.sched_ops = &napi_sched_ops; ctx->exec_ctx.sched_ops = &napi_sched_ops;
ctx->exec_ctx.inited = true; ctx->exec_ctx.inited = true;
ctx->exec_ctx.scale_bin_shift = scale;
init_dummy_netdev(&(ctx->netdev)); init_dummy_netdev(&(ctx->netdev));
netif_napi_add(&(ctx->netdev), &(ctx->napi), hif_exec_poll, netif_napi_add(&(ctx->netdev), &(ctx->napi), hif_exec_poll,
budget); QCA_NAPI_BUDGET);
napi_enable(&ctx->napi); napi_enable(&ctx->napi);
return &ctx->exec_ctx; return &ctx->exec_ctx;
} }
#else #else
static struct hif_exec_context *hif_exec_napi_create(uint32_t budget) static struct hif_exec_context *hif_exec_napi_create(uint32_t scale)
{ {
HIF_WARN("%s: FEATURE_NAPI not defined, making tasklet"); HIF_WARN("%s: FEATURE_NAPI not defined, making tasklet");
return hif_exec_tasklet_create(); return hif_exec_tasklet_create();
@@ -396,7 +417,7 @@ struct hif_exec_context *hif_exec_create(enum hif_exec_type type,
switch (type) { switch (type) {
case HIF_EXEC_NAPI_TYPE: case HIF_EXEC_NAPI_TYPE:
return hif_exec_napi_create(QCA_NAPI_BUDGET * scale); return hif_exec_napi_create(scale);
case HIF_EXEC_TASKLET_TYPE: case HIF_EXEC_TASKLET_TYPE:
return hif_exec_tasklet_create(); return hif_exec_tasklet_create();

View File

@@ -56,6 +56,7 @@ struct hif_exec_context {
uint32_t irq[HIF_MAX_GRP_IRQ]; uint32_t irq[HIF_MAX_GRP_IRQ];
uint32_t os_irq[HIF_MAX_GRP_IRQ]; uint32_t os_irq[HIF_MAX_GRP_IRQ];
uint32_t grp_id; uint32_t grp_id;
uint32_t scale_bin_shift;
const char *context_name; const char *context_name;
void *context; void *context;
ext_intr_handler handler; ext_intr_handler handler;