From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757553AbcBJKF6 (ORCPT ); Wed, 10 Feb 2016 05:05:58 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52379 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751713AbcBJKFy (ORCPT ); Wed, 10 Feb 2016 05:05:54 -0500 From: Vitaly Kuznetsov To: netdev@vger.kernel.org Cc: devel@linuxdriverproject.org, linux-kernel@vger.kernel.org, "K. Y. Srinivasan" , Haiyang Zhang Subject: Re: [PATCH net] hv_netvsc: Restore needed_headroom request References: <1454689748-29095-1-git-send-email-vkuznets@redhat.com> Date: Wed, 10 Feb 2016 11:05:50 +0100 In-Reply-To: <1454689748-29095-1-git-send-email-vkuznets@redhat.com> (Vitaly Kuznetsov's message of "Fri, 5 Feb 2016 17:29:08 +0100") Message-ID: <87oabonam9.fsf@vitty.brq.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Vitaly Kuznetsov writes: > Commit c0eb454034aa ("hv_netvsc: Don't ask for additional head room in the > skb") got rid of needed_headroom setting for the driver. With the change I > hit the following issue trying to use ptkgen module: > > [ 57.522021] kernel BUG at net/core/skbuff.c:1128! > [ 57.522021] invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC > ... > [ 58.721068] Call Trace: > [ 58.721068] [] netvsc_start_xmit+0x4c6/0x8e0 [hv_netvsc] > ... > [ 58.721068] [] ? pktgen_finalize_skb+0x25c/0x2a0 [pktgen] > [ 58.721068] [] ? __netdev_alloc_skb+0xc0/0x100 > [ 58.721068] [] pktgen_thread_worker+0x257/0x1920 [pktgen] > > Basically, we're calling skb_cow_head(skb, RNDIS_AND_PPI_SIZE) and crash on > if (skb_shared(skb)) > BUG(); > > We probably need to restore needed_headroom setting (but shrunk to > RNDIS_AND_PPI_SIZE as we don't need more) to request the required headroom > space. In theory, it should not give us performance penalty. I'm sorry for the ping but this is kind of a regression and it would be nice to have it fixed in 4.5. Here is a script to trigger kernel crash: #! /bin/sh modprobe pktgen echo "rem_device_all" > /proc/net/pktgen/kpktgend_0 echo "add_device eth0" > /proc/net/pktgen/kpktgend_0 echo "pkt_size 60" > /proc/net/pktgen/eth0 echo "clone_skb 1000000" > /proc/net/pktgen/eth0 echo "count 100000" > /proc/net/pktgen/eth0 echo "dst " > /proc/net/pktgen/eth0 echo "dst_mac " > /proc/net/pktgen/eth0 echo "start" > /proc/net/pktgen/pgctrl cat /proc/net/pktgen/eth0 Please review. > > Signed-off-by: Vitaly Kuznetsov > --- > drivers/net/hyperv/netvsc_drv.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c > index 1d3a665..98e34fe 100644 > --- a/drivers/net/hyperv/netvsc_drv.c > +++ b/drivers/net/hyperv/netvsc_drv.c > @@ -1089,6 +1089,9 @@ static int netvsc_probe(struct hv_device *dev, > net->ethtool_ops = ðtool_ops; > SET_NETDEV_DEV(net, &dev->device); > > + /* We always need headroom for rndis header */ > + net->needed_headroom = RNDIS_AND_PPI_SIZE; > + > /* Notify the netvsc driver of the new device */ > memset(&device_info, 0, sizeof(device_info)); > device_info.ring_size = ring_size; -- Vitaly