Loading drivers/rmnet/shs/rmnet_shs.h +7 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_trace.h> #include <../include/soc/qcom/qmi_rmnet.h> #ifndef _RMNET_SHS_H_ #define _RMNET_SHS_H_ Loading Loading @@ -54,6 +57,7 @@ struct rmnet_shs_cfg_s { struct hrtimer hrtimer_shs; struct rps_map *map; struct rmnet_map_dl_ind dl_mrk_ind_cb; struct qmi_rmnet_ps_ind rmnet_idl_ind_cb; struct rmnet_port *port; long int num_bytes_parked; long int num_pkts_parked; Loading Loading @@ -230,4 +234,7 @@ void rmnet_shs_flush_table(u8 is_force_flush); void rmnet_shs_cpu_node_remove(struct rmnet_shs_skbn_s *node); void rmnet_shs_init(struct net_device *dev); void rmnet_shs_exit(void); void rmnet_shs_ps_on_hdlr(void *port); void rmnet_shs_ps_off_hdlr(void *port); #endif /* _RMNET_SHS_H_ */ drivers/rmnet/shs/rmnet_shs_config.c +11 −1 Original line number Diff line number Diff line Loading @@ -109,7 +109,8 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb, /* Need separate if check to avoid * NULL dereferencing */ if (rmnet_shs_skb_entry != NULL && phy_dev) { if (phy_dev) { rmnet_shs_init(phy_dev); rmnet_shs_wq_init(phy_dev); rmnet_shs_aggregate_init(); Loading @@ -122,8 +123,17 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb, RMNET_SHS_MODULE_INIT_WQ, 0xDEF, 0xDEF, 0xDEF, 0xDEF, NULL, NULL); rmnet_shs_cfg.rmnet_idl_ind_cb.ps_on_handler = &rmnet_shs_ps_on_hdlr; rmnet_shs_cfg.rmnet_idl_ind_cb.ps_off_handler = &rmnet_shs_ps_off_hdlr; RCU_INIT_POINTER(rmnet_shs_skb_entry, rmnet_shs_assign); } rmnet_shs_wq_set_ep_active(dev); } break; Loading drivers/rmnet/shs/rmnet_shs_main.c +19 −2 Original line number Diff line number Diff line Loading @@ -686,9 +686,20 @@ void rmnet_shs_aggregate_init(void) rmnet_shs_cfg.hrtimer_shs.function = rmnet_shs_map_flush_queue; } void rmnet_shs_dl_hdr_handler(struct rmnet_map_dl_ind_hdr *dlhdr) void rmnet_shs_ps_on_hdlr(void *port) { rmnet_shs_flush_table(1); rmnet_shs_wq_pause(); } void rmnet_shs_ps_off_hdlr(void *port) { rmnet_shs_wq_restart(); } void rmnet_shs_dl_hdr_handler(struct rmnet_map_dl_ind_hdr *dlhdr) { trace_rmnet_shs_low(RMNET_SHS_DL_MRK, RMNET_SHS_DL_MRK_HDR_HDLR_START, dlhdr->le.seq, dlhdr->le.pkts, 0xDEF, 0xDEF, NULL, NULL); Loading Loading @@ -727,7 +738,6 @@ void rmnet_shs_init(struct net_device *dev) INIT_LIST_HEAD(&rmnet_shs_cpu_node_tbl[num_cpu].node_list_id); rmnet_shs_init_complete = 1; } /* Invoked during SHS module exit to gracefully consume all Loading Loading @@ -760,6 +770,7 @@ void rmnet_shs_cancel_table(void) rmnet_shs_cfg.num_pkts_parked = 0; rmnet_shs_cfg.is_pkt_parked = 0; rmnet_shs_cfg.force_flush_state = RMNET_SHS_FLUSH_DONE; spin_unlock_irqrestore(&rmnet_shs_ht_splock, ht_flags); } Loading Loading @@ -911,6 +922,9 @@ void rmnet_shs_assign(struct sk_buff *skb, struct rmnet_port *port) if (!rmnet_shs_cfg.is_reg_dl_mrk_ind) { rmnet_map_dl_ind_register(port, &rmnet_shs_cfg.dl_mrk_ind_cb); qmi_rmnet_ps_ind_register(port, &rmnet_shs_cfg.rmnet_idl_ind_cb); rmnet_shs_cfg.is_reg_dl_mrk_ind = 1; INIT_WORK(&shs_delayed_work.work, rmnet_flush_buffered); shs_delayed_work.port = port; Loading Loading @@ -983,6 +997,8 @@ void rmnet_shs_assign(struct sk_buff *skb, struct rmnet_port *port) */ void rmnet_shs_exit(void) { qmi_rmnet_ps_ind_deregister(rmnet_shs_cfg.port, &rmnet_shs_cfg.rmnet_idl_ind_cb); rmnet_shs_cfg.dl_mrk_ind_cb.dl_hdr_handler = NULL; rmnet_shs_cfg.dl_mrk_ind_cb.dl_trl_handler = NULL; Loading @@ -993,5 +1009,6 @@ void rmnet_shs_exit(void) hrtimer_cancel(&rmnet_shs_cfg.hrtimer_shs); memset(&rmnet_shs_cfg, 0, sizeof(rmnet_shs_cfg)); rmnet_shs_init_complete = 0; } drivers/rmnet/shs/rmnet_shs_wq.c +15 −1 Original line number Diff line number Diff line Loading @@ -1091,8 +1091,10 @@ int rmnet_shs_wq_get_perf_cpu_new_flow(struct net_device *dev) if (!ep->is_ep_active) continue; if (ep->ep->egress_dev == dev) if (ep->ep->egress_dev == dev) { is_match_found = 1; break; } } if (!is_match_found) { Loading Loading @@ -1354,6 +1356,18 @@ void rmnet_shs_wq_init_cpu_rx_flow_tbl(void) } void rmnet_shs_wq_pause(void) { if (rmnet_shs_wq && rmnet_shs_delayed_wq) cancel_delayed_work_sync(&rmnet_shs_delayed_wq->wq); } void rmnet_shs_wq_restart(void) { if (rmnet_shs_wq && rmnet_shs_delayed_wq) queue_delayed_work(rmnet_shs_wq, &rmnet_shs_delayed_wq->wq, 0); } void rmnet_shs_wq_init(struct net_device *dev) { /*If the workqueue is already initialized we should not be Loading drivers/rmnet/shs/rmnet_shs_wq.h +3 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,9 @@ enum rmnet_shs_wq_trace_evt { }; void rmnet_shs_wq_init(struct net_device *dev); void rmnet_shs_wq_exit(void); void rmnet_shs_wq_restart(void); void rmnet_shs_wq_pause(void); u64 rmnet_shs_wq_get_max_pps_among_cores(u32 core_msk); void rmnet_shs_wq_create_new_flow(struct rmnet_shs_skbn_s *node_p); int rmnet_shs_wq_get_least_utilized_core(u16 core_msk); Loading Loading
drivers/rmnet/shs/rmnet_shs.h +7 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,9 @@ #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_trace.h> #include <../include/soc/qcom/qmi_rmnet.h> #ifndef _RMNET_SHS_H_ #define _RMNET_SHS_H_ Loading Loading @@ -54,6 +57,7 @@ struct rmnet_shs_cfg_s { struct hrtimer hrtimer_shs; struct rps_map *map; struct rmnet_map_dl_ind dl_mrk_ind_cb; struct qmi_rmnet_ps_ind rmnet_idl_ind_cb; struct rmnet_port *port; long int num_bytes_parked; long int num_pkts_parked; Loading Loading @@ -230,4 +234,7 @@ void rmnet_shs_flush_table(u8 is_force_flush); void rmnet_shs_cpu_node_remove(struct rmnet_shs_skbn_s *node); void rmnet_shs_init(struct net_device *dev); void rmnet_shs_exit(void); void rmnet_shs_ps_on_hdlr(void *port); void rmnet_shs_ps_off_hdlr(void *port); #endif /* _RMNET_SHS_H_ */
drivers/rmnet/shs/rmnet_shs_config.c +11 −1 Original line number Diff line number Diff line Loading @@ -109,7 +109,8 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb, /* Need separate if check to avoid * NULL dereferencing */ if (rmnet_shs_skb_entry != NULL && phy_dev) { if (phy_dev) { rmnet_shs_init(phy_dev); rmnet_shs_wq_init(phy_dev); rmnet_shs_aggregate_init(); Loading @@ -122,8 +123,17 @@ static int rmnet_shs_dev_notify_cb(struct notifier_block *nb, RMNET_SHS_MODULE_INIT_WQ, 0xDEF, 0xDEF, 0xDEF, 0xDEF, NULL, NULL); rmnet_shs_cfg.rmnet_idl_ind_cb.ps_on_handler = &rmnet_shs_ps_on_hdlr; rmnet_shs_cfg.rmnet_idl_ind_cb.ps_off_handler = &rmnet_shs_ps_off_hdlr; RCU_INIT_POINTER(rmnet_shs_skb_entry, rmnet_shs_assign); } rmnet_shs_wq_set_ep_active(dev); } break; Loading
drivers/rmnet/shs/rmnet_shs_main.c +19 −2 Original line number Diff line number Diff line Loading @@ -686,9 +686,20 @@ void rmnet_shs_aggregate_init(void) rmnet_shs_cfg.hrtimer_shs.function = rmnet_shs_map_flush_queue; } void rmnet_shs_dl_hdr_handler(struct rmnet_map_dl_ind_hdr *dlhdr) void rmnet_shs_ps_on_hdlr(void *port) { rmnet_shs_flush_table(1); rmnet_shs_wq_pause(); } void rmnet_shs_ps_off_hdlr(void *port) { rmnet_shs_wq_restart(); } void rmnet_shs_dl_hdr_handler(struct rmnet_map_dl_ind_hdr *dlhdr) { trace_rmnet_shs_low(RMNET_SHS_DL_MRK, RMNET_SHS_DL_MRK_HDR_HDLR_START, dlhdr->le.seq, dlhdr->le.pkts, 0xDEF, 0xDEF, NULL, NULL); Loading Loading @@ -727,7 +738,6 @@ void rmnet_shs_init(struct net_device *dev) INIT_LIST_HEAD(&rmnet_shs_cpu_node_tbl[num_cpu].node_list_id); rmnet_shs_init_complete = 1; } /* Invoked during SHS module exit to gracefully consume all Loading Loading @@ -760,6 +770,7 @@ void rmnet_shs_cancel_table(void) rmnet_shs_cfg.num_pkts_parked = 0; rmnet_shs_cfg.is_pkt_parked = 0; rmnet_shs_cfg.force_flush_state = RMNET_SHS_FLUSH_DONE; spin_unlock_irqrestore(&rmnet_shs_ht_splock, ht_flags); } Loading Loading @@ -911,6 +922,9 @@ void rmnet_shs_assign(struct sk_buff *skb, struct rmnet_port *port) if (!rmnet_shs_cfg.is_reg_dl_mrk_ind) { rmnet_map_dl_ind_register(port, &rmnet_shs_cfg.dl_mrk_ind_cb); qmi_rmnet_ps_ind_register(port, &rmnet_shs_cfg.rmnet_idl_ind_cb); rmnet_shs_cfg.is_reg_dl_mrk_ind = 1; INIT_WORK(&shs_delayed_work.work, rmnet_flush_buffered); shs_delayed_work.port = port; Loading Loading @@ -983,6 +997,8 @@ void rmnet_shs_assign(struct sk_buff *skb, struct rmnet_port *port) */ void rmnet_shs_exit(void) { qmi_rmnet_ps_ind_deregister(rmnet_shs_cfg.port, &rmnet_shs_cfg.rmnet_idl_ind_cb); rmnet_shs_cfg.dl_mrk_ind_cb.dl_hdr_handler = NULL; rmnet_shs_cfg.dl_mrk_ind_cb.dl_trl_handler = NULL; Loading @@ -993,5 +1009,6 @@ void rmnet_shs_exit(void) hrtimer_cancel(&rmnet_shs_cfg.hrtimer_shs); memset(&rmnet_shs_cfg, 0, sizeof(rmnet_shs_cfg)); rmnet_shs_init_complete = 0; }
drivers/rmnet/shs/rmnet_shs_wq.c +15 −1 Original line number Diff line number Diff line Loading @@ -1091,8 +1091,10 @@ int rmnet_shs_wq_get_perf_cpu_new_flow(struct net_device *dev) if (!ep->is_ep_active) continue; if (ep->ep->egress_dev == dev) if (ep->ep->egress_dev == dev) { is_match_found = 1; break; } } if (!is_match_found) { Loading Loading @@ -1354,6 +1356,18 @@ void rmnet_shs_wq_init_cpu_rx_flow_tbl(void) } void rmnet_shs_wq_pause(void) { if (rmnet_shs_wq && rmnet_shs_delayed_wq) cancel_delayed_work_sync(&rmnet_shs_delayed_wq->wq); } void rmnet_shs_wq_restart(void) { if (rmnet_shs_wq && rmnet_shs_delayed_wq) queue_delayed_work(rmnet_shs_wq, &rmnet_shs_delayed_wq->wq, 0); } void rmnet_shs_wq_init(struct net_device *dev) { /*If the workqueue is already initialized we should not be Loading
drivers/rmnet/shs/rmnet_shs_wq.h +3 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,9 @@ enum rmnet_shs_wq_trace_evt { }; void rmnet_shs_wq_init(struct net_device *dev); void rmnet_shs_wq_exit(void); void rmnet_shs_wq_restart(void); void rmnet_shs_wq_pause(void); u64 rmnet_shs_wq_get_max_pps_among_cores(u32 core_msk); void rmnet_shs_wq_create_new_flow(struct rmnet_shs_skbn_s *node_p); int rmnet_shs_wq_get_least_utilized_core(u16 core_msk); Loading