Skip to content

Commit

Permalink
dfc: not using alarm timer
Browse files Browse the repository at this point in the history
Not using alarm timer for dfc powersave check and eliminate the need
for a wakelock. This allows AP to go to suspend quicker.

Change-Id: I7153055d0231a65125ad88808db9e1d0032f24d9
Signed-off-by: Weiyi Chen <quic_weiyic@quicinc.com>
  • Loading branch information
Weiyi Chen authored and jabashque committed Feb 18, 2023
1 parent 618ddea commit 09c7a58
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 59 deletions.
61 changes: 5 additions & 56 deletions drivers/soc/qcom/qmi_rmnet.c
Expand Up @@ -15,7 +15,6 @@
#include <trace/events/dfc.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#include <linux/alarmtimer.h>

#define NLMSG_FLOW_ACTIVATE 1
#define NLMSG_FLOW_DEACTIVATE 2
Expand Down Expand Up @@ -610,7 +609,6 @@ qmi_rmnet_setup_client(void *port, struct qmi_info *qmi, struct tcmsg *tcm)
if (!qmi)
return -ENOMEM;

qmi->ws = wakeup_source_register(NULL, "RMNET_DFC");
rmnet_init_qmi_pt(port, qmi);
}

Expand Down Expand Up @@ -659,7 +657,6 @@ __qmi_rmnet_delete_client(void *port, struct qmi_info *qmi, int idx)

if (!qmi_rmnet_has_client(qmi) && !qmi_rmnet_has_pending(qmi)) {
rmnet_reset_qmi_pt(port);
wakeup_source_unregister(qmi->ws);
kfree(qmi);
return 0;
}
Expand Down Expand Up @@ -728,7 +725,6 @@ void qmi_rmnet_change_link(struct net_device *dev, void *port, void *tcm_pt)
!qmi_rmnet_has_client(qmi) &&
!qmi_rmnet_has_pending(qmi)) {
rmnet_reset_qmi_pt(port);
wakeup_source_unregister(qmi->ws);
kfree(qmi);
}
} else if (tcm->tcm_ifindex & FLAG_POWERSAVE_MASK) {
Expand Down Expand Up @@ -1068,7 +1064,6 @@ static LIST_HEAD(ps_list);

struct rmnet_powersave_work {
struct delayed_work work;
struct alarm atimer;
void *port;
u64 old_rx_pkts;
u64 old_tx_pkts;
Expand Down Expand Up @@ -1153,40 +1148,13 @@ static void qmi_rmnet_work_restart(void *port)
rcu_read_unlock();
}

static enum alarmtimer_restart qmi_rmnet_work_alarm(struct alarm *atimer,
ktime_t now)
{
struct rmnet_powersave_work *real_work;

real_work = container_of(atimer, struct rmnet_powersave_work, atimer);
qmi_rmnet_work_restart(real_work->port);
return ALARMTIMER_NORESTART;
}

static void dfc_wakelock_acquire(struct qmi_info *qmi)
{
if (qmi && !qmi->wakelock_active) {
__pm_stay_awake(qmi->ws);
qmi->wakelock_active = true;
}
}

static void dfc_wakelock_release(struct qmi_info *qmi)
{
if (qmi && qmi->wakelock_active) {
__pm_relax(qmi->ws);
qmi->wakelock_active = false;
}
}

static void qmi_rmnet_check_stats(struct work_struct *work)
{
struct rmnet_powersave_work *real_work;
struct qmi_info *qmi;
u64 rxd, txd;
u64 rx, tx;
bool dl_msg_active;
bool use_alarm_timer = true;

real_work = container_of(to_delayed_work(work),
struct rmnet_powersave_work, work);
Expand All @@ -1198,8 +1166,6 @@ static void qmi_rmnet_check_stats(struct work_struct *work)
if (unlikely(!qmi))
return;

dfc_wakelock_release(qmi);

rmnet_get_packets(real_work->port, &rx, &tx);
rxd = rx - real_work->old_rx_pkts;
txd = tx - real_work->old_tx_pkts;
Expand Down Expand Up @@ -1234,10 +1200,8 @@ static void qmi_rmnet_check_stats(struct work_struct *work)
* (likely in RLF), no need to enter powersave
*/
if (!dl_msg_active &&
!rmnet_all_flows_enabled(real_work->port)) {
use_alarm_timer = false;
!rmnet_all_flows_enabled(real_work->port))
goto end;
}

/* Deregister to suppress QMI DFC and DL marker */
if (qmi_rmnet_set_powersave_mode(real_work->port, 1) < 0)
Expand All @@ -1261,21 +1225,9 @@ static void qmi_rmnet_check_stats(struct work_struct *work)
}
end:
rcu_read_lock();
if (!rmnet_work_quit) {
if (use_alarm_timer) {
/* Suspend will fail and get delayed for 2s if
* alarmtimer expires within 2s. Hold a wakelock
* for the actual timer duration to prevent suspend
*/
if (PS_INTERVAL_MS < 2000)
dfc_wakelock_acquire(qmi);
alarm_start_relative(&real_work->atimer,
PS_INTERVAL_KT);
} else {
queue_delayed_work(rmnet_ps_wq, &real_work->work,
PS_INTERVAL);
}
}
if (!rmnet_work_quit)
queue_delayed_work(rmnet_ps_wq, &real_work->work,
PS_INTERVAL);
rcu_read_unlock();
}

Expand Down Expand Up @@ -1310,8 +1262,7 @@ void qmi_rmnet_work_init(void *port)
rmnet_ps_wq = NULL;
return;
}
INIT_DEFERRABLE_WORK(&rmnet_work->work, qmi_rmnet_check_stats);
alarm_init(&rmnet_work->atimer, ALARM_BOOTTIME, qmi_rmnet_work_alarm);
INIT_DELAYED_WORK(&rmnet_work->work, qmi_rmnet_check_stats);
rmnet_work->port = port;
rmnet_get_packets(rmnet_work->port, &rmnet_work->old_rx_pkts,
&rmnet_work->old_tx_pkts);
Expand Down Expand Up @@ -1345,14 +1296,12 @@ void qmi_rmnet_work_exit(void *port)
synchronize_rcu();

rmnet_work_inited = false;
alarm_cancel(&rmnet_work->atimer);
cancel_delayed_work_sync(&rmnet_work->work);
destroy_workqueue(rmnet_ps_wq);
qmi_rmnet_work_set_active(port, 0);
rmnet_ps_wq = NULL;
kfree(rmnet_work);
rmnet_work = NULL;
dfc_wakelock_release((struct qmi_info *)rmnet_get_qmi_pt(port));
}
EXPORT_SYMBOL(qmi_rmnet_work_exit);

Expand Down
3 changes: 0 additions & 3 deletions drivers/soc/qcom/qmi_rmnet_i.h
Expand Up @@ -10,7 +10,6 @@
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/timer.h>
#include <linux/pm_wakeup.h>

#define MAX_MQ_NUM 16
#define MAX_CLIENT_NUM 2
Expand Down Expand Up @@ -100,8 +99,6 @@ struct qmi_info {
bool ps_enabled;
bool dl_msg_active;
bool ps_ignore_grant;
bool wakelock_active;
struct wakeup_source *ws;
};

enum data_ep_type_enum_v01 {
Expand Down

0 comments on commit 09c7a58

Please sign in to comment.