qcacld-3.0: Add CPU mask support to pm_qos calls

Call the pm_qos voting for specific instead of applying vote
for all cores.

Change-Id: I74b3696e15f0adc38149265dacdd5fb10e9055fe
CRs-Fixed: 2495713
这个提交包含在:
Manjunathappa Prakash
2019-07-28 00:01:18 -07:00
提交者 nshrivas
父节点 f47e20670b
当前提交 eb1ec86246
修改 4 个文件,包含 130 行新增5 行删除

1
Kbuild
查看文件

@@ -2633,6 +2633,7 @@ ifeq ($(CONFIG_LITHIUM), y)
cppflags-$(CONFIG_WLAN_TX_FLOW_CONTROL_V2) += -DQCA_AC_BASED_FLOW_CONTROL
endif
cppflags-$(CONFIG_WLAN_CLD_PM_QOS) += -DCLD_PM_QOS
cppflags-$(CONFIG_WLAN_FEATURE_11AX) += -DWLAN_FEATURE_11AX
cppflags-$(CONFIG_WLAN_FEATURE_11AX) += -DWLAN_FEATURE_11AX_BSS_COLOR
cppflags-$(CONFIG_WLAN_FEATURE_11AX) += -DSUPPORT_11AX_D3

查看文件

@@ -388,6 +388,7 @@ CONFIG_HTT_PADDR64 := y
CONFIG_RX_OL := y
CONFIG_TX_TID_OVERRIDE := y
CONFIG_DP_TXRX_SOC_ATTACH := y
CONFIG_WLAN_CLD_PM_QOS := y
endif
# As per target team, build is done as follows:

查看文件

@@ -47,6 +47,9 @@
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <net/cfg80211.h>
#ifdef CLD_PM_QOS
#include <linux/pm_qos.h>
#endif
#include <linux/ieee80211.h>
#include <qdf_delayed_work.h>
#include <qdf_list.h>
@@ -1966,6 +1969,9 @@ struct hdd_context {
qdf_time_t runtime_resume_start_time_stamp;
qdf_time_t runtime_suspend_done_time_stamp;
#ifdef CLD_PM_QOS
struct pm_qos_request pm_qos_req;
#endif
};
/**

查看文件

@@ -8107,6 +8107,97 @@ static void hdd_clear_rps_cpu_mask(struct hdd_context *hdd_ctx)
hdd_send_rps_disable_ind(adapter);
}
#ifdef CLD_PM_QOS
#define PLD_REMOVE_PM_QOS(x)
#define PLD_REQUEST_PM_QOS(x, y)
/**
* hdd_pm_qos_update_cpu_mask() - Prepare CPU mask for PM_qos voting
* @mask: return variable of cpumask for the TPUT
* @high_throughput: only update high cores mask for high TPUT
*
* Return: none
*/
static inline void hdd_pm_qos_update_cpu_mask(cpumask_t *mask,
bool high_throughput)
{
cpumask_set_cpu(0, mask);
cpumask_set_cpu(1, mask);
cpumask_set_cpu(2, mask);
cpumask_set_cpu(3, mask);
if (high_throughput) {
/* For high TPUT include GOLD mask also */
cpumask_set_cpu(4, mask);
cpumask_set_cpu(5, mask);
cpumask_set_cpu(6, mask);
}
}
/**
* hdd_pm_qos_update_request() - API to request for pm_qos
* @hdd_ctx: handle to hdd context
* @pm_qos_cpu_mask: cpu_mask to apply
*
* Return: none
*/
static inline void hdd_pm_qos_update_request(struct hdd_context *hdd_ctx,
cpumask_t *pm_qos_cpu_mask)
{
cpumask_copy(&hdd_ctx->pm_qos_req.cpus_affine, pm_qos_cpu_mask);
/* Latency value to be read from INI */
pm_qos_update_request(&hdd_ctx->pm_qos_req, 1);
}
#ifdef CONFIG_SMP
/**
* hdd_update_pm_qos_affine_cores() - Update PM_qos request for AFFINE_CORES
* @hdd_ctx: handle to hdd context
*
* Return: none
*/
static inline void hdd_update_pm_qos_affine_cores(struct hdd_context *hdd_ctx)
{
hdd_ctx->pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
}
#else
static inline void hdd_update_pm_qos_affine_cores(struct hdd_context *hdd_ctx)
{
}
#endif
static inline void hdd_pm_qos_add_request(struct hdd_context *hdd_ctx)
{
hdd_update_pm_qos_affine_cores(hdd_ctx);
pm_qos_add_request(&hdd_ctx->pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
PM_QOS_DEFAULT_VALUE);
}
static inline void hdd_pm_qos_remove_request(struct hdd_context *hdd_ctx)
{
pm_qos_remove_request(&hdd_ctx->pm_qos_req);
}
#else
#define PLD_REMOVE_PM_QOS(x) pld_remove_pm_qos(x)
#define PLD_REQUEST_PM_QOS(x, y) pld_request_pm_qos(x, y)
static inline void hdd_pm_qos_add_request(struct hdd_context *hdd_ctx)
{
}
static inline void hdd_pm_qos_remove_request(struct hdd_context *hdd_ctx)
{
}
static inline void hdd_pm_qos_update_cpu_mask(cpumask_t *mask,
bool high_throughput)
{
}
static inline void hdd_pm_qos_update_request(struct hdd_context *hdd_ctx,
cpumask_t *pm_qos_cpu_mask)
{
}
#endif
/**
* hdd_pld_request_bus_bandwidth() - Function to control bus bandwidth
* @hdd_ctx - handle to hdd context
@@ -8138,6 +8229,10 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx,
enum wlan_tp_level next_tx_level = WLAN_SVC_TP_NONE;
uint32_t delack_timer_cnt = hdd_ctx->config->tcp_delack_timer_count;
uint32_t bus_low_cnt_threshold = hdd_ctx->config->bus_low_cnt_threshold;
cpumask_t pm_qos_cpu_mask;
bool enable_pm_qos_high = false;
cpumask_clear(&pm_qos_cpu_mask);
if (total_pkts > hdd_ctx->config->bus_bw_very_high_threshold)
next_vote_level = PLD_BUS_WIDTH_VERY_HIGH;
@@ -8172,14 +8267,14 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx,
if ((next_vote_level == PLD_BUS_WIDTH_LOW) ||
(next_vote_level == PLD_BUS_WIDTH_IDLE)) {
if (hdd_ctx->hbw_requested) {
pld_remove_pm_qos(hdd_ctx->parent_dev);
PLD_REMOVE_PM_QOS(hdd_ctx->parent_dev);
hdd_ctx->hbw_requested = false;
}
if (hdd_ctx->dynamic_rps)
hdd_clear_rps_cpu_mask(hdd_ctx);
} else {
if (!hdd_ctx->hbw_requested) {
pld_request_pm_qos(hdd_ctx->parent_dev, 1);
PLD_REQUEST_PM_QOS(hdd_ctx->parent_dev, 1);
hdd_ctx->hbw_requested = true;
}
if (hdd_ctx->dynamic_rps)
@@ -8222,11 +8317,15 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx,
* 2)when rx_ol is disabled in cases like concurrency etc
* 3)For UDP cases
*/
if (avg_no_rx_offload_pkts >
hdd_ctx->config->bus_bw_high_threshold)
if (avg_no_rx_offload_pkts > hdd_ctx->config->bus_bw_high_threshold) {
rxthread_high_tput_req = true;
else
enable_pm_qos_high = true;
} else {
rxthread_high_tput_req = false;
enable_pm_qos_high = false;
}
hdd_pm_qos_update_cpu_mask(&pm_qos_cpu_mask, enable_pm_qos_high);
if (cds_sched_handle_throughput_req(rxthread_high_tput_req))
hdd_warn("Rx thread high_tput(%d) affinity request failed",
@@ -8269,6 +8368,14 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx,
/* fine-tuning parameters for TX Flows */
temp_tx = (tx_packets + hdd_ctx->prev_tx) / 2;
hdd_ctx->prev_tx = tx_packets;
if (temp_tx > hdd_ctx->config->bus_bw_high_threshold)
enable_pm_qos_high = true;
else
enable_pm_qos_high = false;
hdd_pm_qos_update_cpu_mask(&pm_qos_cpu_mask, enable_pm_qos_high);
if (temp_tx > hdd_ctx->config->tcp_tx_high_tput_thres)
next_tx_level = WLAN_SVC_TP_HIGH;
else
@@ -8297,6 +8404,12 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx,
hdd_ctx->hdd_txrx_hist[index].qtime = qdf_get_log_timestamp();
hdd_ctx->hdd_txrx_hist_idx++;
hdd_ctx->hdd_txrx_hist_idx &= NUM_TX_RX_HISTOGRAM_MASK;
/* Clear all the mask if no silver/gold vote is required */
if (next_vote_level < PLD_BUS_WIDTH_MEDIUM)
cpumask_clear(&pm_qos_cpu_mask);
hdd_pm_qos_update_request(hdd_ctx, &pm_qos_cpu_mask);
}
hdd_display_periodic_stats(hdd_ctx, (total_pkts > 0) ? true : false);
@@ -8468,6 +8581,9 @@ int hdd_bus_bandwidth_init(struct hdd_context *hdd_ctx)
hdd_enter();
qdf_spinlock_create(&hdd_ctx->bus_bw_lock);
hdd_pm_qos_add_request(hdd_ctx);
status = qdf_periodic_work_create(&hdd_ctx->bus_bw_work,
hdd_bus_bw_work_handler,
hdd_ctx);
@@ -8484,6 +8600,7 @@ void hdd_bus_bandwidth_deinit(struct hdd_context *hdd_ctx)
QDF_BUG(!qdf_periodic_work_stop_sync(&hdd_ctx->bus_bw_work));
qdf_periodic_work_destroy(&hdd_ctx->bus_bw_work);
qdf_spinlock_destroy(&hdd_ctx->bus_bw_lock);
hdd_pm_qos_remove_request(hdd_ctx);
hdd_exit();
}