Bug 1430038

Summary: Add missing hunk for upstream skbufhead-raw-lock RT patches
Product: Red Hat Enterprise Linux 7 Reporter: Arnaldo Carvalho de Melo <acme>
Component: kernel-rtAssignee: Arnaldo Carvalho de Melo <acme>
kernel-rt sub component: Networking QA Contact: Jiri Kastner <jkastner>
Status: CLOSED ERRATA Docs Contact:
Severity: unspecified    
Priority: high CC: acme, bhu, jkacur, jkastner, jshortt, kzhang, lgoncalv, williams
Version: 7.4   
Target Milestone: rc   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: If docs needed, set a value
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2017-08-01 19:02:59 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1353018, 1410158    

Description Arnaldo Carvalho de Melo 2017-03-07 17:38:15 UTC
Description of problem:

The broken out patch tarball //www.kernel.org/pub/linux/kernel/projects/rt/4.8/patch-4.8.15-rt10.patch.xz comes with two patches: skbufhead-raw-lock.patch and skbufhead-raw-lock-free-skbs.patch, dealing with a patch management mishap by the 4.8.15-rt10 maintainer, that we have in our rhel-7.4/rt-master branch as just one patch, the original from 2011, by tglx: 85b9e707d00ab ("skbufhead-raw-lock.patch").

The problem is that something happened, a merge probably, and a hunk, the one that coincidentally is handled (slightly differently) in skbufhead-raw-lock-free-skbs.patch, disappeared, i.e. the freeing of the skbs moved to the softnet_data->tofree_q skb_queue_head list.

So, to match 4.8.15-rt10 (and the original work by tglx), we need to apply skbufhead-raw-lock-free-skbs.patch.

In a diff:

diff -u rhel7/net/core/dev.c v4.8.15-rt10/net/core/dev.c

@@ -4971,13 +5214,21 @@
        struct softnet_data *sd = this_cpu_ptr(&softnet_data);
        unsigned long time_limit = jiffies + 2;
        int budget = netdev_budget;
+       struct sk_buff_head tofree_q;
+       struct sk_buff *skb;
        LIST_HEAD(list);
        LIST_HEAD(repoll);
 
+       __skb_queue_head_init(&tofree_q);
+
        local_irq_disable();
+       skb_queue_splice_init(&sd->tofree_queue, &tofree_q);
        list_splice_init(&sd->poll_list, &list);
        local_irq_enable();
 
+       while ((skb = __skb_dequeue(&tofree_q)))
+               kfree_skb(skb);
+
        for (;;) {
                struct napi_struct *n;
 
 -----

So the effect is that without this hunk skbs will get leaked when network devices are unregistered and packets remained in its queued to be processed.

Comment 2 Arnaldo Carvalho de Melo 2017-04-12 14:12:56 UTC
Patch submitted and applied by Luis Claudio.

Comment 7 errata-xmlrpc 2017-08-01 19:02:59 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHSA-2017:2077

Comment 8 errata-xmlrpc 2017-08-02 00:25:36 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory, and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHSA-2017:2077