summaryrefslogtreecommitdiff
path: root/drivers/rmnet/shs
diff options
context:
space:
mode:
authorSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>2019-09-26 11:57:08 -0700
committerSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>2019-10-01 10:23:57 -0700
commitc614b36db9e0ad44bee743cd73d5e88f2a983243 (patch)
tree93c0fa8b6570651724b4a69d5251e8bfe975ce38 /drivers/rmnet/shs
parent7d824227d4cb1c0cc433c8d78bfe5d07a33e9bc6 (diff)
downloaddata-kernel-c614b36db9e0ad44bee743cd73d5e88f2a983243.tar.gz
drivers: rmnet_shs: Change rmnet_port init
Rmnet_port was being collected previously from the first saved instance of a phy_dev into a temporary variable. This could cause issue if the phy_dev was incorrectly made. This change causes the phy_dev to be collected at the time of initialization when the 1st rmnet is brought up. <6> Unable to handle kernel paging request at virtual address 6b6b6b6b6b6b6b <6> Mem abort info: <6> Exception class = DABT (current EL), IL = 32 bits <6> SET = 0, FnV = 0 <6> EA = 0, S1PTW = 0 <6> FSC = 4 <6> Data abort info: <6> ISV = 0, ISS = 0x00000004 <6> CM = 0, WnR = 0 <6> [006b6b6b6b6b6b6b] address between user and kernel address ranges <6> Internal error: Oops: 96000004 [#1] PREEMPT SMP <2> Call trace: <2> rmnet_map_dl_ind_deregister+0x3c/0x84 <2> rmnet_shs_exit+0x40/0x74 [rmnet_shs] <2> rmnet_shs_dev_notify_cb+0x100/0x48c [rmnet_shs] <2> notifier_call_chain+0x8c/0xd0 <2> raw_notifier_call_chain+0x38/0x48 <2> call_netdevice_notifiers_info+0x40/0x70 <2> __dev_close_many+0x64/0x108 <2> dev_close_many+0x88/0x138 <2> rollback_registered_many+0x138/0x434 <2> rollback_registered+0x5c/0xa0 <2> unregister_netdevice_queue+0x94/0xac <2> unregister_netdev+0x24/0x34 Change-Id: Idc2b3059cbcb9c1ccb1091c630d27bdcdc0e894d Acked-by: Raul Martinez <mraul@qti.qualcomm.com> Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org
Diffstat (limited to 'drivers/rmnet/shs')
-rw-r--r--drivers/rmnet/shs/rmnet_shs_config.c44
-rwxr-xr-xdrivers/rmnet/shs/rmnet_shs_main.c1
-rw-r--r--drivers/rmnet/shs/rmnet_shs_wq.c6
3 files changed, 21 insertions, 30 deletions
diff --git a/drivers/rmnet/shs/rmnet_shs_config.c b/drivers/rmnet/shs/rmnet_shs_config.c
index 74799ee..341dcc9 100644
--- a/drivers/rmnet/shs/rmnet_shs_config.c
+++ b/drivers/rmnet/shs/rmnet_shs_config.c
@@ -48,13 +48,7 @@ static int rmnet_vnd_total;
/* Enable smart hashing capability upon call to initialize module*/
int __init rmnet_shs_module_init(void)
{
-
- if (unlikely(rmnet_shs_debug))
- pr_info("%s(): Initializing rmnet SHS module\n", __func__);
-
- if (!rmnet_shs_skb_entry)
- RCU_INIT_POINTER(rmnet_shs_skb_entry, rmnet_shs_assign);
-
+ pr_info("%s(): Starting rmnet SHS module\n", __func__);
trace_rmnet_shs_high(RMNET_SHS_MODULE, RMNET_SHS_MODULE_INIT,
0xDEF, 0xDEF, 0xDEF, 0xDEF, NULL, NULL);
return register_netdevice_notifier(&rmnet_shs_dev_notifier);
@@ -63,21 +57,10 @@ int __init rmnet_shs_module_init(void)
/* Remove smart hashing capability upon call to initialize module */
void __exit rmnet_shs_module_exit(void)
{
- RCU_INIT_POINTER(rmnet_shs_skb_entry, NULL);
-
- if (rmnet_shs_cfg.rmnet_shs_init_complete) {
- qmi_rmnet_ps_ind_deregister(rmnet_shs_cfg.port,
- &rmnet_shs_cfg.rmnet_idl_ind_cb);
- rmnet_shs_cancel_table();
- rmnet_shs_rx_wq_exit();
- rmnet_shs_wq_exit();
- rmnet_shs_exit();
- }
- unregister_netdevice_notifier(&rmnet_shs_dev_notifier);
- if (unlikely(rmnet_shs_debug))
- pr_info("Exiting rmnet_shs module");
trace_rmnet_shs_high(RMNET_SHS_MODULE, RMNET_SHS_MODULE_EXIT,
0xDEF, 0xDEF, 0xDEF, 0xDEF, NULL, NULL);
+ unregister_netdevice_notifier(&rmnet_shs_dev_notifier);
+ pr_info("%s(): Exiting rmnet SHS module\n", __func__);
}
static int rmnet_shs_dev_notify_cb(struct notifier_block *nb,
@@ -85,7 +68,6 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb,
{
struct net_device *dev = netdev_notifier_info_to_dev(data);
- static struct net_device *phy_dev = NULL;
struct rmnet_priv *priv;
struct rmnet_port *port;
@@ -108,6 +90,7 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb,
(!strcmp(dev->name, "rmnet_ipa0") ||
!strcmp(dev->name, "rmnet_mhi0"))) &&
rmnet_shs_cfg.rmnet_shs_init_complete) {
+ pr_info("rmnet_shs deinit %s going down ", dev->name);
RCU_INIT_POINTER(rmnet_shs_skb_entry, NULL);
qmi_rmnet_ps_ind_deregister(rmnet_shs_cfg.port,
&rmnet_shs_cfg.rmnet_idl_ind_cb);
@@ -123,10 +106,6 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb,
break;
case NETDEV_UP:
- if (strncmp(dev->name, "rmnet_ipa0", 10) == 0 ||
- strncmp(dev->name, "rmnet_mhi0", 10) == 0)
- phy_dev = dev;
-
if (strncmp(dev->name, "rmnet_data", 10) == 0){
rmnet_vnd_total++;
@@ -137,15 +116,20 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb,
* NULL dereferencing
*/
- if (phy_dev && !rmnet_shs_cfg.rmnet_shs_init_complete) {
- rmnet_shs_init(phy_dev, dev);
- rmnet_shs_wq_init(phy_dev);
+ if (!rmnet_shs_cfg.rmnet_shs_init_complete) {
+ pr_info("rmnet_shs initializing %s", dev->name);
+ priv = netdev_priv(dev);
+ port = rmnet_get_port(priv->real_dev);
+ if (!port) {
+ pr_err("rmnet_shs: invalid rmnet_port");
+ break;
+ }
+ rmnet_shs_init(priv->real_dev, dev);
+ rmnet_shs_wq_init(priv->real_dev);
rmnet_shs_rx_wq_init();
rmnet_shs_cfg.is_timer_init = 1;
rmnet_shs_cfg.dl_mrk_ind_cb.priority =
RMNET_SHS;
- priv = netdev_priv(dev);
- port = rmnet_get_port(priv->real_dev);
if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER_V2) {
rmnet_shs_cfg.dl_mrk_ind_cb.dl_hdr_handler_v2 =
&rmnet_shs_dl_hdr_handler_v2;
diff --git a/drivers/rmnet/shs/rmnet_shs_main.c b/drivers/rmnet/shs/rmnet_shs_main.c
index 6c7acd5..4b7734b 100755
--- a/drivers/rmnet/shs/rmnet_shs_main.c
+++ b/drivers/rmnet/shs/rmnet_shs_main.c
@@ -1659,6 +1659,7 @@ void rmnet_shs_exit(void)
hrtimer_cancel(&rmnet_shs_cfg.hrtimer_shs);
memset(&rmnet_shs_cfg, 0, sizeof(rmnet_shs_cfg));
+ rmnet_shs_cfg.port = NULL;
rmnet_shs_cfg.rmnet_shs_init_complete = 0;
}
diff --git a/drivers/rmnet/shs/rmnet_shs_wq.c b/drivers/rmnet/shs/rmnet_shs_wq.c
index 19a78c9..31bcaca 100644
--- a/drivers/rmnet/shs/rmnet_shs_wq.c
+++ b/drivers/rmnet/shs/rmnet_shs_wq.c
@@ -1258,7 +1258,13 @@ void rmnet_shs_wq_update_ep_rps_msk(struct rmnet_shs_wq_ep_s *ep)
}
rcu_read_lock();
+ if (!ep->ep || !ep->ep->egress_dev) {
+ pr_info(" rmnet_shs invalid state %p", ep->ep);
+ rmnet_shs_crit_err[RMNET_SHS_WQ_EP_ACCESS_ERR]++;
+ return;
+ }
map = rcu_dereference(ep->ep->egress_dev->_rx->rps_map);
+
ep->rps_config_msk = 0;
if (map != NULL) {
for (len = 0; len < map->len; len++)