From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lorenzo Bianconi Subject: net: thunderx: nicvf_xdp_setup error code path Date: Tue, 20 Nov 2018 18:56:36 +0100 Message-ID: <20181120175635.GA21691@localhost.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: sgoutham@cavium.com To: netdev@vger.kernel.org Return-path: Received: from mail-wm1-f68.google.com ([209.85.128.68]:38655 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725876AbeKUE1D (ORCPT ); Tue, 20 Nov 2018 23:27:03 -0500 Received: by mail-wm1-f68.google.com with SMTP id k198so3206391wmd.3 for ; Tue, 20 Nov 2018 09:56:40 -0800 (PST) Content-Disposition: inline Sender: netdev-owner@vger.kernel.org List-ID: Hi all, looking at thunderx XDP support I noticed that nic->xdp_prog pointer in nicvf_xdp_setup is not actually set to NULL if bpf_prog_add fails but it is initialized with bpf_prog_add error code. xdp_prog pointer value is used in the driver to verify if XDP is currently enabled. Moreover nicvf_xdp_setup does not report to the userspace any error code in case of failure. I wrote the following patch to fix the reported issues. Please note I just compiled it, not actually tested since I have no thunderx nic at the moment. @Sunil: could you please give it a whirl? If it is ok I will post a formal patch, thanks Regards, Lorenzo diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c index 768f584f8392..88f8a8fa93cd 100644 --- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c +++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c @@ -1784,6 +1784,7 @@ static int nicvf_xdp_setup(struct nicvf *nic, struct bpf_prog *prog) bool if_up = netif_running(nic->netdev); struct bpf_prog *old_prog; bool bpf_attached = false; + int ret = 0; /* For now just support only the usual MTU sized frames */ if (prog && (dev->mtu > 1500)) { @@ -1817,8 +1818,12 @@ static int nicvf_xdp_setup(struct nicvf *nic, struct bpf_prog *prog) if (nic->xdp_prog) { /* Attach BPF program */ nic->xdp_prog = bpf_prog_add(nic->xdp_prog, nic->rx_queues - 1); - if (!IS_ERR(nic->xdp_prog)) + if (!IS_ERR(nic->xdp_prog)) { bpf_attached = true; + } else { + ret = PTR_ERR(nic->xdp_prog); + nic->xdp_prog = NULL; + } } /* Calculate Tx queues needed for XDP and network stack */ @@ -1830,7 +1835,7 @@ static int nicvf_xdp_setup(struct nicvf *nic, struct bpf_prog *prog) netif_trans_update(nic->netdev); } - return 0; + return ret; } static int nicvf_xdp(struct net_device *netdev, struct netdev_bpf *xdp)