Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9b38611e authored by Subash Abhinov Kasiviswanathan's avatar Subash Abhinov Kasiviswanathan
Browse files

rmnet: Reduce synchronize_rcu calls



Avoid callig synchronize_rcu() in a loop for every rmnet vnd
during SSR or shutdown by doing it only once.

Change-Id: I9788a431ca227fc49eee24d94d0803354d10fbc6
Acked-by: default avatarWeiyi Chen <weiyic@qti.qualcomm.com>
Signed-off-by: default avatarSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
parent d4ba3a24
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -257,6 +257,8 @@ static void rmnet_dellink(struct net_device *dev, struct list_head *head)

	unregister_netdevice(dev);

	qmi_rmnet_qos_exit_post();

	rmnet_unregister_real_device(real_dev, port);
}

@@ -294,11 +296,14 @@ static void rmnet_force_unassociate_device(struct net_device *dev)
		hlist_del(&ep->hlnode);
		kfree(ep);
	}

	/* Unregistering devices in context before freeing port.
	 * If this API becomes non-context their order should switch.
	 */
	unregister_netdevice_many(&list);

	qmi_rmnet_qos_exit_post();

	rmnet_unregister_real_device(real_dev, port);
}

+1 −2
Original line number Diff line number Diff line
@@ -119,8 +119,7 @@ static void rmnet_vnd_uninit(struct net_device *dev)

	qos = priv->qos_info;
	RCU_INIT_POINTER(priv->qos_info, NULL);
	synchronize_rcu();
	qmi_rmnet_qos_exit(dev, qos);
	qmi_rmnet_qos_exit_pre(qos);
}

static void rmnet_get_stats64(struct net_device *dev,
+19 −15
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ unsigned int rmnet_wq_frequency __read_mostly = 1000;

#ifdef CONFIG_QCOM_QMI_DFC
static unsigned int qmi_rmnet_scale_factor = 5;
static LIST_HEAD(qos_cleanup_list);
#endif

static int
@@ -129,8 +130,7 @@ qmi_rmnet_has_pending(struct qmi_info *qmi)

#ifdef CONFIG_QCOM_QMI_DFC
static void
qmi_rmnet_clean_flow_list(struct qmi_info *qmi, struct net_device *dev,
			  struct qos_info *qos)
qmi_rmnet_clean_flow_list(struct qos_info *qos)
{
	struct rmnet_bearer_map *bearer, *br_tmp;
	struct rmnet_flow_map *itm, *fl_tmp;
@@ -479,10 +479,6 @@ struct rmnet_bearer_map *qmi_rmnet_get_bearer_noref(struct qos_info *qos_info,
}

#else
static inline void qmi_rmnet_clean_flow_list(struct qos_info *qos)
{
}

static inline void
qmi_rmnet_update_flow_map(struct rmnet_flow_map *itm,
			  struct rmnet_flow_map *new_map)
@@ -900,19 +896,27 @@ void *qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id)
}
EXPORT_SYMBOL(qmi_rmnet_qos_init);

void qmi_rmnet_qos_exit(struct net_device *dev, void *qos)
void qmi_rmnet_qos_exit_pre(void *qos)
{
	void *port = rmnet_get_rmnet_port(dev);
	struct qmi_info *qmi = rmnet_get_qmi_pt(port);
	struct qos_info *qos_info = (struct qos_info *)qos;

	if (!qmi || !qos)
	if (!qos)
		return;

	qmi_rmnet_clean_flow_list(qmi, dev, qos_info);
	list_add(&((struct qos_info *)qos)->list, &qos_cleanup_list);
}
EXPORT_SYMBOL(qmi_rmnet_qos_exit_pre);

void qmi_rmnet_qos_exit_post(void)
{
	struct qos_info *qos, *tmp;

	synchronize_rcu();
	list_for_each_entry_safe(qos, tmp, &qos_cleanup_list, list) {
		list_del(&qos->list);
		qmi_rmnet_clean_flow_list(qos);
		kfree(qos);
	}
EXPORT_SYMBOL(qmi_rmnet_qos_exit);
}
EXPORT_SYMBOL(qmi_rmnet_qos_exit_post);
#endif

#ifdef CONFIG_QCOM_QMI_POWER_COLLAPSE
+1 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ struct mq_map {
};

struct qos_info {
	struct list_head list;
	u8 mux_id;
	struct net_device *real_dev;
	struct list_head flow_head;
+7 −2
Original line number Diff line number Diff line
@@ -45,7 +45,8 @@ qmi_rmnet_all_flows_enabled(struct net_device *dev)

#ifdef CONFIG_QCOM_QMI_DFC
void *qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id);
void qmi_rmnet_qos_exit(struct net_device *dev, void *qos);
void qmi_rmnet_qos_exit_pre(void *qos);
void qmi_rmnet_qos_exit_post(void);
void qmi_rmnet_burst_fc_check(struct net_device *dev,
			      int ip_type, u32 mark, unsigned int len);
int qmi_rmnet_get_queue(struct net_device *dev, struct sk_buff *skb);
@@ -56,7 +57,11 @@ qmi_rmnet_qos_init(struct net_device *real_dev, u8 mux_id)
	return NULL;
}

static inline void qmi_rmnet_qos_exit(struct net_device *dev, void *qos)
static inline void qmi_rmnet_qos_exit_pre(void *qos)
{
}

static inline void qmi_rmnet_qos_exit_post(void)
{
}