diff options
author | Subash Abhinov Kasiviswanathan <subashab@codeaurora.org> | 2019-09-26 11:57:08 -0700 |
---|---|---|
committer | Subash Abhinov Kasiviswanathan <subashab@codeaurora.org> | 2019-10-01 10:23:57 -0700 |
commit | c614b36db9e0ad44bee743cd73d5e88f2a983243 (patch) | |
tree | 93c0fa8b6570651724b4a69d5251e8bfe975ce38 /drivers | |
parent | 7d824227d4cb1c0cc433c8d78bfe5d07a33e9bc6 (diff) | |
download | data-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')
-rw-r--r-- | drivers/rmnet/shs/rmnet_shs_config.c | 44 | ||||
-rwxr-xr-x | drivers/rmnet/shs/rmnet_shs_main.c | 1 | ||||
-rw-r--r-- | drivers/rmnet/shs/rmnet_shs_wq.c | 6 |
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++) |