Loading drivers/rmnet/perf/rmnet_perf_config.c +33 −19 Original line number Diff line number Diff line Loading @@ -116,16 +116,15 @@ rmnet_perf_config_free_resources(struct rmnet_perf *perf) } /* Free everything flow nodes currently hold */ rmnet_perf_opt_flush_all_flow_nodes(perf); rmnet_perf_opt_flush_all_flow_nodes(); /* Get rid of 64k sk_buff cache */ rmnet_perf_config_free_64k_buffs(perf); /* Before we free tcp_opt's structures, make sure we arent holding * any SKB's hostage */ rmnet_perf_core_free_held_skbs(perf); rmnet_perf_core_free_held_skbs(); //rmnet_perf_core_timer_exit(perf->core_meta); /* Since we allocated in one chunk, we will also free in one chunk */ kfree(perf); Loading Loading @@ -193,11 +192,11 @@ static int rmnet_perf_config_allocate_resources(struct rmnet_perf **perf) *flow_node = buffer_head; buffer_head += flow_node_size; (*flow_node)->num_pkts_held = 0; (*flow_node)->len = 0; } local_perf->core_meta = buffer_head; core_meta = local_perf->core_meta; //rmnet_perf_core_timer_init(core_meta); buffer_head += core_meta_size; /* Assign common (not specific to something like opt) structures */ Loading Loading @@ -345,6 +344,18 @@ rmnet_perf_dereg_callbacks(struct net_device *dev, return return_val_final; } static bool rmnet_perf_config_hook_registered(void) { int (*deag_entry)(struct sk_buff *skb); void (*frag_entry)(struct rmnet_frag_descriptor *frag_desc, struct rmnet_port *port); deag_entry = rcu_dereference(rmnet_perf_deag_entry); frag_entry = rcu_dereference(rmnet_perf_desc_entry); return deag_entry || frag_entry; } /* TODO Needs modifying*/ static int rmnet_perf_config_notify_cb(struct notifier_block *nb, unsigned long event, void *data) Loading @@ -360,11 +371,12 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb, switch (event) { case NETDEV_UNREGISTER: if (rmnet_is_real_dev_registered(dev) && rmnet_perf_deag_entry && !strncmp(dev->name, "rmnet_ipa0", 10)) { rmnet_perf_config_hook_registered() && (!strncmp(dev->name, "rmnet_ipa0", 10) || !strncmp(dev->name, "rmnet_mhi0", 10))) { struct rmnet_perf_core_meta *core_meta = perf->core_meta; pr_err("%s(): rmnet_perf netdevice unregister\n", pr_info("%s(): rmnet_perf netdevice unregister\n", __func__); return_val = rmnet_perf_dereg_callbacks(dev, core_meta); return_val |= rmnet_perf_netdev_down(); Loading @@ -372,19 +384,22 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb, pr_err("%s(): Error on netdev down event\n", __func__); RCU_INIT_POINTER(rmnet_perf_deag_entry, NULL); RCU_INIT_POINTER(rmnet_perf_desc_entry, NULL); RCU_INIT_POINTER(rmnet_perf_chain_end, NULL); } break; case NETDEV_REGISTER: pr_err("%s(): rmnet_perf netdevice register, name = %s\n", pr_info("%s(): rmnet_perf netdevice register, name = %s\n", __func__, dev->name); /* Check prevents us from allocating resources for every * interface */ if (!rmnet_perf_deag_entry && if (!rmnet_perf_config_hook_registered() && strncmp(dev->name, "rmnet_data", 10) == 0) { struct rmnet_priv *priv = netdev_priv(dev); port = rmnet_get_port(priv->real_dev); return_val |= rmnet_perf_netdev_up(priv->real_dev, return_val = rmnet_perf_netdev_up(priv->real_dev, port); if (return_val == RMNET_PERF_RESOURCE_MGMT_FAIL) { pr_err("%s(): rmnet_perf allocation " Loading @@ -398,10 +413,9 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb, "failed. Continue without them\n", __func__); } RCU_INIT_POINTER(rmnet_perf_deag_entry, rmnet_perf_core_deaggregate); pr_err("%s(): rmnet_perf registered on " "name = %s\n", __func__, dev->name); rmnet_perf_core_set_ingress_hook(); pr_info("%s(): rmnet_perf registered on name = %s\n", __func__, dev->name); } break; default: Loading @@ -417,13 +431,13 @@ static struct notifier_block rmnet_perf_dev_notifier __read_mostly = { int __init rmnet_perf_init(void) { pr_err("%s(): initializing rmnet_perf\n", __func__); pr_info("%s(): initializing rmnet_perf\n", __func__); return register_netdevice_notifier(&rmnet_perf_dev_notifier); } void __exit rmnet_perf_exit(void) { pr_err("%s(): exiting rmnet_perf\n", __func__); pr_info("%s(): exiting rmnet_perf\n", __func__); unregister_netdevice_notifier(&rmnet_perf_dev_notifier); } Loading drivers/rmnet/perf/rmnet_perf_config.h +5 −18 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ #include <linux/skbuff.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_descriptor.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_trace.h> Loading @@ -32,25 +33,11 @@ enum rmnet_perf_resource_management_e { }; /* rmnet based variables that we rely on*/ extern void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port); extern struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id); extern int rmnet_is_real_dev_registered(const struct net_device *real_dev); extern void rmnet_set_skb_proto(struct sk_buff *skb); extern int (*rmnet_perf_deag_entry)(struct sk_buff *skb); extern int rmnet_map_checksum_downlink_packet(struct sk_buff *skb, u16 len); extern struct napi_struct *get_current_napi_context(void); //extern int napi_gro_complete(struct sk_buff *skb); extern int rmnet_map_flow_command(struct sk_buff *skb, struct rmnet_port *port, bool rmnet_perf); extern int rmnet_map_dl_ind_register(struct rmnet_port *port, struct rmnet_map_dl_ind *dl_ind); extern int rmnet_map_dl_ind_deregister(struct rmnet_port *port, struct rmnet_map_dl_ind *dl_ind); extern struct rmnet_port *rmnet_get_port(struct net_device *real_dev); extern void rmnet_map_cmd_init(struct rmnet_port *port); extern void rmnet_map_cmd_exit(struct rmnet_port *port); extern void (*rmnet_perf_desc_entry)(struct rmnet_frag_descriptor *frag_desc, struct rmnet_port *port); extern void (*rmnet_perf_chain_end)(void); /* Function declarations */ struct rmnet_perf *rmnet_perf_config_get_perf(void); Loading Loading
drivers/rmnet/perf/rmnet_perf_config.c +33 −19 Original line number Diff line number Diff line Loading @@ -116,16 +116,15 @@ rmnet_perf_config_free_resources(struct rmnet_perf *perf) } /* Free everything flow nodes currently hold */ rmnet_perf_opt_flush_all_flow_nodes(perf); rmnet_perf_opt_flush_all_flow_nodes(); /* Get rid of 64k sk_buff cache */ rmnet_perf_config_free_64k_buffs(perf); /* Before we free tcp_opt's structures, make sure we arent holding * any SKB's hostage */ rmnet_perf_core_free_held_skbs(perf); rmnet_perf_core_free_held_skbs(); //rmnet_perf_core_timer_exit(perf->core_meta); /* Since we allocated in one chunk, we will also free in one chunk */ kfree(perf); Loading Loading @@ -193,11 +192,11 @@ static int rmnet_perf_config_allocate_resources(struct rmnet_perf **perf) *flow_node = buffer_head; buffer_head += flow_node_size; (*flow_node)->num_pkts_held = 0; (*flow_node)->len = 0; } local_perf->core_meta = buffer_head; core_meta = local_perf->core_meta; //rmnet_perf_core_timer_init(core_meta); buffer_head += core_meta_size; /* Assign common (not specific to something like opt) structures */ Loading Loading @@ -345,6 +344,18 @@ rmnet_perf_dereg_callbacks(struct net_device *dev, return return_val_final; } static bool rmnet_perf_config_hook_registered(void) { int (*deag_entry)(struct sk_buff *skb); void (*frag_entry)(struct rmnet_frag_descriptor *frag_desc, struct rmnet_port *port); deag_entry = rcu_dereference(rmnet_perf_deag_entry); frag_entry = rcu_dereference(rmnet_perf_desc_entry); return deag_entry || frag_entry; } /* TODO Needs modifying*/ static int rmnet_perf_config_notify_cb(struct notifier_block *nb, unsigned long event, void *data) Loading @@ -360,11 +371,12 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb, switch (event) { case NETDEV_UNREGISTER: if (rmnet_is_real_dev_registered(dev) && rmnet_perf_deag_entry && !strncmp(dev->name, "rmnet_ipa0", 10)) { rmnet_perf_config_hook_registered() && (!strncmp(dev->name, "rmnet_ipa0", 10) || !strncmp(dev->name, "rmnet_mhi0", 10))) { struct rmnet_perf_core_meta *core_meta = perf->core_meta; pr_err("%s(): rmnet_perf netdevice unregister\n", pr_info("%s(): rmnet_perf netdevice unregister\n", __func__); return_val = rmnet_perf_dereg_callbacks(dev, core_meta); return_val |= rmnet_perf_netdev_down(); Loading @@ -372,19 +384,22 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb, pr_err("%s(): Error on netdev down event\n", __func__); RCU_INIT_POINTER(rmnet_perf_deag_entry, NULL); RCU_INIT_POINTER(rmnet_perf_desc_entry, NULL); RCU_INIT_POINTER(rmnet_perf_chain_end, NULL); } break; case NETDEV_REGISTER: pr_err("%s(): rmnet_perf netdevice register, name = %s\n", pr_info("%s(): rmnet_perf netdevice register, name = %s\n", __func__, dev->name); /* Check prevents us from allocating resources for every * interface */ if (!rmnet_perf_deag_entry && if (!rmnet_perf_config_hook_registered() && strncmp(dev->name, "rmnet_data", 10) == 0) { struct rmnet_priv *priv = netdev_priv(dev); port = rmnet_get_port(priv->real_dev); return_val |= rmnet_perf_netdev_up(priv->real_dev, return_val = rmnet_perf_netdev_up(priv->real_dev, port); if (return_val == RMNET_PERF_RESOURCE_MGMT_FAIL) { pr_err("%s(): rmnet_perf allocation " Loading @@ -398,10 +413,9 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb, "failed. Continue without them\n", __func__); } RCU_INIT_POINTER(rmnet_perf_deag_entry, rmnet_perf_core_deaggregate); pr_err("%s(): rmnet_perf registered on " "name = %s\n", __func__, dev->name); rmnet_perf_core_set_ingress_hook(); pr_info("%s(): rmnet_perf registered on name = %s\n", __func__, dev->name); } break; default: Loading @@ -417,13 +431,13 @@ static struct notifier_block rmnet_perf_dev_notifier __read_mostly = { int __init rmnet_perf_init(void) { pr_err("%s(): initializing rmnet_perf\n", __func__); pr_info("%s(): initializing rmnet_perf\n", __func__); return register_netdevice_notifier(&rmnet_perf_dev_notifier); } void __exit rmnet_perf_exit(void) { pr_err("%s(): exiting rmnet_perf\n", __func__); pr_info("%s(): exiting rmnet_perf\n", __func__); unregister_netdevice_notifier(&rmnet_perf_dev_notifier); } Loading
drivers/rmnet/perf/rmnet_perf_config.h +5 −18 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ #include <linux/skbuff.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_descriptor.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h> #include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_trace.h> Loading @@ -32,25 +33,11 @@ enum rmnet_perf_resource_management_e { }; /* rmnet based variables that we rely on*/ extern void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port); extern struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port, u8 mux_id); extern int rmnet_is_real_dev_registered(const struct net_device *real_dev); extern void rmnet_set_skb_proto(struct sk_buff *skb); extern int (*rmnet_perf_deag_entry)(struct sk_buff *skb); extern int rmnet_map_checksum_downlink_packet(struct sk_buff *skb, u16 len); extern struct napi_struct *get_current_napi_context(void); //extern int napi_gro_complete(struct sk_buff *skb); extern int rmnet_map_flow_command(struct sk_buff *skb, struct rmnet_port *port, bool rmnet_perf); extern int rmnet_map_dl_ind_register(struct rmnet_port *port, struct rmnet_map_dl_ind *dl_ind); extern int rmnet_map_dl_ind_deregister(struct rmnet_port *port, struct rmnet_map_dl_ind *dl_ind); extern struct rmnet_port *rmnet_get_port(struct net_device *real_dev); extern void rmnet_map_cmd_init(struct rmnet_port *port); extern void rmnet_map_cmd_exit(struct rmnet_port *port); extern void (*rmnet_perf_desc_entry)(struct rmnet_frag_descriptor *frag_desc, struct rmnet_port *port); extern void (*rmnet_perf_chain_end)(void); /* Function declarations */ struct rmnet_perf *rmnet_perf_config_get_perf(void); Loading