diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2020-06-22 07:13:27 -0700 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2020-06-22 07:13:27 -0700 |
commit | 18d37a11555d5bb5be05c3514c1a2de2c884e339 (patch) | |
tree | a39755f351ef5280eb15164cda7f7b1864848f03 | |
parent | 4d16b3953e40968c1a788b487b20deb25496bbab (diff) | |
parent | 036f4f0274978a8511c05677e0cc0fc9436b302a (diff) | |
download | data-kernel-18d37a11555d5bb5be05c3514c1a2de2c884e339.tar.gz |
Merge 036f4f0274978a8511c05677e0cc0fc9436b302a on remote branch
Change-Id: I453b1cd01d95e0b4dc20a543480592993dfea704
-rw-r--r-- | drivers/rmnet/shs/rmnet_shs_config.h | 1 | ||||
-rwxr-xr-x | drivers/rmnet/shs/rmnet_shs_main.c | 23 | ||||
-rw-r--r-- | drivers/rmnet/shs/rmnet_shs_wq.c | 7 | ||||
-rw-r--r-- | drivers/rmnet/shs/rmnet_shs_wq_mem.c | 9 | ||||
-rw-r--r-- | drivers/rmnet/shs/rmnet_shs_wq_mem.h | 2 |
5 files changed, 29 insertions, 13 deletions
diff --git a/drivers/rmnet/shs/rmnet_shs_config.h b/drivers/rmnet/shs/rmnet_shs_config.h index 10b8f58..8d318c1 100644 --- a/drivers/rmnet/shs/rmnet_shs_config.h +++ b/drivers/rmnet/shs/rmnet_shs_config.h @@ -48,6 +48,7 @@ enum rmnet_shs_crit_err_e { RMNET_SHS_WQ_NL_SOCKET_ERR, RMNET_SHS_CPU_FLOWS_BNDS_ERR, RMNET_SHS_OUT_OF_MEM_ERR, + RMNET_SHS_UDP_SEGMENT, RMNET_SHS_CRIT_ERR_MAX }; diff --git a/drivers/rmnet/shs/rmnet_shs_main.c b/drivers/rmnet/shs/rmnet_shs_main.c index dec38c4..8d9ed2b 100755 --- a/drivers/rmnet/shs/rmnet_shs_main.c +++ b/drivers/rmnet/shs/rmnet_shs_main.c @@ -404,6 +404,7 @@ static struct sk_buff *rmnet_shs_skb_partial_segment(struct sk_buff *skb, struct sk_buff *segments, *tmp; u16 gso_size = shinfo->gso_size; u16 gso_segs = shinfo->gso_segs; + unsigned int gso_type = shinfo->gso_type; if (segments_per_skb >= gso_segs) { return NULL; @@ -420,15 +421,19 @@ static struct sk_buff *rmnet_shs_skb_partial_segment(struct sk_buff *skb, return NULL; } - /* Mark correct number of segments and correct size in the new skbs */ + /* Mark correct number of segments, size, and type in the new skbs */ for (tmp = segments; tmp; tmp = tmp->next) { struct skb_shared_info *new_shinfo = skb_shinfo(tmp); - new_shinfo->gso_size = gso_size; - if (gso_segs >= segments_per_skb) - new_shinfo->gso_segs = segments_per_skb; - else - new_shinfo->gso_segs = gso_segs; + if (tmp->len > gso_size) { + new_shinfo->gso_type = gso_type; + new_shinfo->gso_size = gso_size; + + if (gso_segs >= segments_per_skb) + new_shinfo->gso_segs = segments_per_skb; + else + new_shinfo->gso_segs = gso_segs; + } gso_segs -= segments_per_skb; } @@ -1012,6 +1017,8 @@ void rmnet_shs_flush_node(struct rmnet_shs_skbn_s *node, u8 ctext) skb_bytes_delivered += skb->len; if (segs_per_skb > 0) { + if (node->skb_tport_proto == IPPROTO_UDP) + rmnet_shs_crit_err[RMNET_SHS_UDP_SEGMENT]++; rmnet_shs_deliver_skb_segmented(skb, ctext, segs_per_skb); } else { @@ -1511,7 +1518,7 @@ int rmnet_shs_drop_backlog(struct sk_buff_head *list, int cpu) return 0; } - +/* This will run in process context, avoid disabling bh */ static int rmnet_shs_oom_notify(struct notifier_block *self, unsigned long emtpy, void *free) { @@ -1520,7 +1527,6 @@ static int rmnet_shs_oom_notify(struct notifier_block *self, struct sk_buff_head *process_q; struct sk_buff_head *input_q; - local_bh_disable(); for_each_possible_cpu(cpu) { process_q = &GET_PQUEUE(cpu); @@ -1541,7 +1547,6 @@ static int rmnet_shs_oom_notify(struct notifier_block *self, (*nfree)++; } } - local_bh_enable(); return 0; } diff --git a/drivers/rmnet/shs/rmnet_shs_wq.c b/drivers/rmnet/shs/rmnet_shs_wq.c index f300c22..3445519 100644 --- a/drivers/rmnet/shs/rmnet_shs_wq.c +++ b/drivers/rmnet/shs/rmnet_shs_wq.c @@ -296,6 +296,7 @@ void rmnet_shs_wq_hstat_reset_node(struct rmnet_shs_wq_hstat_s *hnode) hnode->hash = 0; hnode->suggested_cpu = 0; hnode->current_cpu = 0; + hnode->segs_per_skb = 0; hnode->skb_tport_proto = 0; hnode->stat_idx = -1; INIT_LIST_HEAD(&hnode->cpu_node_id); @@ -409,7 +410,8 @@ void rmnet_shs_wq_create_new_flow(struct rmnet_shs_skbn_s *node_p) node_p->hstats->skb_tport_proto = node_p->skb_tport_proto; node_p->hstats->current_cpu = node_p->map_cpu; node_p->hstats->suggested_cpu = node_p->map_cpu; - + /* Set egmentation off by default */ + node_p->hstats->segs_per_skb = 0; /* Start TCP flows with segmentation if userspace connected */ if (rmnet_shs_userspace_connected && node_p->hstats->skb_tport_proto == IPPROTO_TCP) @@ -2149,7 +2151,8 @@ void rmnet_shs_wq_init(struct net_device *dev) return; } - rmnet_shs_wq_mem_init(); + if( rmnet_shs_wq_mem_init() ) + rmnet_shs_wq_genl_deinit(); trace_rmnet_shs_wq_high(RMNET_SHS_WQ_INIT, RMNET_SHS_WQ_INIT_START, 0xDEF, 0xDEF, 0xDEF, 0xDEF, NULL, NULL); diff --git a/drivers/rmnet/shs/rmnet_shs_wq_mem.c b/drivers/rmnet/shs/rmnet_shs_wq_mem.c index e914d78..7c5dbad 100644 --- a/drivers/rmnet/shs/rmnet_shs_wq_mem.c +++ b/drivers/rmnet/shs/rmnet_shs_wq_mem.c @@ -953,13 +953,19 @@ void rmnet_shs_wq_mem_update_cached_netdevs(void) } /* Creates the proc folder and files for shs shared memory */ -void rmnet_shs_wq_mem_init(void) +int rmnet_shs_wq_mem_init(void) { kuid_t shs_uid; kgid_t shs_gid; shs_proc_dir = proc_mkdir("shs", NULL); + if(!shs_proc_dir) + { + rm_err("%s", "SHS_MEM: shs_proc_dir returned as NULL\n"); + return -1; + } + shs_uid = make_kuid(&init_user_ns, 1001); shs_gid = make_kgid(&init_user_ns, 1001); @@ -977,6 +983,7 @@ void rmnet_shs_wq_mem_init(void) ssflow_shared = NULL; netdev_shared = NULL; rmnet_shs_wq_ep_unlock_bh(); + return 0; } /* Remove shs files and folders from proc fs */ diff --git a/drivers/rmnet/shs/rmnet_shs_wq_mem.h b/drivers/rmnet/shs/rmnet_shs_wq_mem.h index e955606..374a556 100644 --- a/drivers/rmnet/shs/rmnet_shs_wq_mem.h +++ b/drivers/rmnet/shs/rmnet_shs_wq_mem.h @@ -107,7 +107,7 @@ void rmnet_shs_wq_mem_update_cached_sorted_gold_flows(struct list_head *gold_flo void rmnet_shs_wq_mem_update_cached_sorted_ss_flows(struct list_head *ss_flows); void rmnet_shs_wq_mem_update_cached_netdevs(void); -void rmnet_shs_wq_mem_init(void); +int rmnet_shs_wq_mem_init(void); void rmnet_shs_wq_mem_deinit(void); |