summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2020-06-22 07:13:27 -0700
committerLinux Build Service Account <lnxbuild@localhost>2020-06-22 07:13:27 -0700
commit18d37a11555d5bb5be05c3514c1a2de2c884e339 (patch)
treea39755f351ef5280eb15164cda7f7b1864848f03
parent4d16b3953e40968c1a788b487b20deb25496bbab (diff)
parent036f4f0274978a8511c05677e0cc0fc9436b302a (diff)
downloaddata-kernel-18d37a11555d5bb5be05c3514c1a2de2c884e339.tar.gz
Merge 036f4f0274978a8511c05677e0cc0fc9436b302a on remote branch
Change-Id: I453b1cd01d95e0b4dc20a543480592993dfea704
-rw-r--r--drivers/rmnet/shs/rmnet_shs_config.h1
-rwxr-xr-xdrivers/rmnet/shs/rmnet_shs_main.c23
-rw-r--r--drivers/rmnet/shs/rmnet_shs_wq.c7
-rw-r--r--drivers/rmnet/shs/rmnet_shs_wq_mem.c9
-rw-r--r--drivers/rmnet/shs/rmnet_shs_wq_mem.h2
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);