]> git.proxmox.com Git - mirror_ovs.git/commitdiff
datapath: stt: linearize in SKIP_ZERO_COPY case
authorNeal Shrader via dev <ovs-dev@openvswitch.org>
Fri, 22 Jun 2018 22:18:50 +0000 (18:18 -0400)
committerPravin B Shelar <pshelar@ovn.org>
Tue, 26 Jun 2018 03:07:16 +0000 (20:07 -0700)
During the investigation of a kernel panic, we encountered a condition
that triggered a kernel panic due to a large skb with an unusual
geometry.  Inside of the STT codepath, an effort is made to linearize
such packets to avoid trouble during both fragment reassembly and
segmentation in the linux networking core.

As currently implemented, kernels with CONFIG_SLUB defined will skip
this process because it does not expect an skb with a frag_list to be
present.  This patch removes the assumption, and allows these skb to
be linearized as intended.  We confirmed this corrects the panic we
encountered.

Reported-by: Johannes Erdfelt <johannes@erdfelt.com>
Reported-at: https://mail.openvswitch.org/pipermail/ovs-discuss/2018-May/046800.html
Requested-by: Pravin Shelar <pshelar@ovn.org>
Signed-off-by: Neal Shrader <neal@digitalocean.com>
Signed-off-by: Pravin Shelar <pshelar@ovn.org>
datapath/linux/compat/stt.c

index 2426223db0492b9c33927b11943f8547f7f6638b..fc7e74f6d46739b704b077a657d13bca23f32236 100644 (file)
@@ -562,12 +562,6 @@ static int __try_to_segment(struct sk_buff *skb, bool csum_partial,
 
 static int try_to_segment(struct sk_buff *skb)
 {
-#ifdef SKIP_ZERO_COPY
-       /* coalesce_skb() since does not generate frag-list no need to
-        * linearize it here.
-        */
-       return 0;
-#else
        struct stthdr *stth = stt_hdr(skb);
        bool csum_partial = !!(stth->flags & STT_CSUM_PARTIAL);
        bool ipv4 = !!(stth->flags & STT_PROTO_IPV4);
@@ -575,7 +569,6 @@ static int try_to_segment(struct sk_buff *skb)
        int l4_offset = stth->l4_offset;
 
        return __try_to_segment(skb, csum_partial, ipv4, tcp, l4_offset);
-#endif
 }
 
 static int segment_skb(struct sk_buff **headp, bool csum_partial,