Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp1772707ybl; Sat, 11 Jan 2020 02:31:29 -0800 (PST) X-Google-Smtp-Source: APXvYqyHQHHb5k+YzAD/ACltUC++nWzD5cmoS1ttTDo7BBFodz1AKAOhrz0urwRqb6rhLZAX71gu X-Received: by 2002:a9d:68d1:: with SMTP id i17mr6044761oto.367.1578738689158; Sat, 11 Jan 2020 02:31:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1578738689; cv=none; d=google.com; s=arc-20160816; b=EpSqGjTToA6UqAqfy39a94C7ePKElUE65swqkEfL06tVly9/C+z5xMTb9kAjmIpJDn ifizgExx7LM1HyiB+wocbTH/Y+I47Rl1CpeJ8iWbp5V36DHLasgjECqa8hT8z9PiZA0G g/sTR87pQ5WOCBkB46VmL/jhk8VE/3H49nv6keJctIe05yUg83MbW2fNoriw93Z4nKCq xgaZl46uF7qvbaQpoa/U9pYkCkj38qJS/8DDALXXx/eld5Nb8SbuJ5MdGnw8K8+zNoIV b0Zlw2jVWh3n7jxER6op3IyFDjQAxtb+SjBefwglVFiNuwXFpsA28420Duf+MUjszhGg AZPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=305EqXdlTPKD9chCRE//ooMirgDEIBtwLjs1IQLTogE=; b=E21/8wsYo+XKAXfxymRHwCI89JHZZeV200nAe5ZfNbnlhvMiOaWcKAfZ41wUcmHget sWP9pad5dETND13/3JJAFjCWT3K+RGWK3LFkF9TL7YhPgK8yrKIH76emU/k4ebFIbG21 1YnEokQGAo6Ljt6yxKOBL6vMmYSdxenloyyeIESIXkyBCfKgDzg/VLTYJR7jg0ExnJq0 nqtsJVzfP7paKYQGPsoDJMu+0uWT/WSvvfOs6oRluPZbpsz+ACaBLYXAvjCQFrJMrcbj d6oo2z+yciFfczqUbMMYQRDGOcThvf97qvZ0sjPZW0lgv57K5rH6ztRQVxRGPST0dM2Q axZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=cXJXSPqX; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m24si3245398otn.67.2020.01.11.02.31.17; Sat, 11 Jan 2020 02:31:29 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=cXJXSPqX; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731258AbgAKK3d (ORCPT + 99 others); Sat, 11 Jan 2020 05:29:33 -0500 Received: from mail.kernel.org ([198.145.29.99]:38780 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729171AbgAKK3c (ORCPT ); Sat, 11 Jan 2020 05:29:32 -0500 Received: from localhost (unknown [62.119.166.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DCEDE20842; Sat, 11 Jan 2020 10:29:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1578738571; bh=gvUfKMKRH/t4NRqfU6iHpf39qn7HbiZhJj6cXBk/K10=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cXJXSPqXv0gWdme58hCKgg2XTVcJ4V0noQU4ags7r81xFokOexH62VfZda8fMy3Dn OVsb1lI1LGc4UPswpDzQWbvz1PclZuMb97oxKWsS2lWV78BiK2G5e7WrV2ZR69wcgb 8PkSC8r1L6lRoQUeD8bqtrYBH3hlxlEh3KdeCmdI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Maxim Mikityanskiy , =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= , Daniel Borkmann , Sasha Levin Subject: [PATCH 5.4 119/165] xsk: Add rcu_read_lock around the XSK wakeup Date: Sat, 11 Jan 2020 10:50:38 +0100 Message-Id: <20200111094933.339758468@linuxfoundation.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200111094921.347491861@linuxfoundation.org> References: <20200111094921.347491861@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Maxim Mikityanskiy [ Upstream commit 06870682087b58398671e8cdc896cd62314c4399 ] The XSK wakeup callback in drivers makes some sanity checks before triggering NAPI. However, some configuration changes may occur during this function that affect the result of those checks. For example, the interface can go down, and all the resources will be destroyed after the checks in the wakeup function, but before it attempts to use these resources. Wrap this callback in rcu_read_lock to allow driver to synchronize_rcu before actually destroying the resources. xsk_wakeup is a new function that encapsulates calling ndo_xsk_wakeup wrapped into the RCU lock. After this commit, xsk_poll starts using xsk_wakeup and checks xs->zc instead of ndo_xsk_wakeup != NULL to decide ndo_xsk_wakeup should be called. It also fixes a bug introduced with the need_wakeup feature: a non-zero-copy socket may be used with a driver supporting zero-copy, and in this case ndo_xsk_wakeup should not be called, so the xs->zc check is the correct one. Fixes: 77cd0d7b3f25 ("xsk: add support for need_wakeup flag in AF_XDP rings") Signed-off-by: Maxim Mikityanskiy Signed-off-by: Björn Töpel Signed-off-by: Daniel Borkmann Link: https://lore.kernel.org/bpf/20191217162023.16011-2-maximmi@mellanox.com Signed-off-by: Sasha Levin --- net/xdp/xsk.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 9044073fbf22..d426fc01c529 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -305,12 +305,21 @@ bool xsk_umem_consume_tx(struct xdp_umem *umem, struct xdp_desc *desc) } EXPORT_SYMBOL(xsk_umem_consume_tx); -static int xsk_zc_xmit(struct xdp_sock *xs) +static int xsk_wakeup(struct xdp_sock *xs, u8 flags) { struct net_device *dev = xs->dev; + int err; + + rcu_read_lock(); + err = dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, flags); + rcu_read_unlock(); + + return err; +} - return dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, - XDP_WAKEUP_TX); +static int xsk_zc_xmit(struct xdp_sock *xs) +{ + return xsk_wakeup(xs, XDP_WAKEUP_TX); } static void xsk_destruct_skb(struct sk_buff *skb) @@ -424,19 +433,16 @@ static unsigned int xsk_poll(struct file *file, struct socket *sock, unsigned int mask = datagram_poll(file, sock, wait); struct sock *sk = sock->sk; struct xdp_sock *xs = xdp_sk(sk); - struct net_device *dev; struct xdp_umem *umem; if (unlikely(!xsk_is_bound(xs))) return mask; - dev = xs->dev; umem = xs->umem; if (umem->need_wakeup) { - if (dev->netdev_ops->ndo_xsk_wakeup) - dev->netdev_ops->ndo_xsk_wakeup(dev, xs->queue_id, - umem->need_wakeup); + if (xs->zc) + xsk_wakeup(xs, umem->need_wakeup); else /* Poll needs to drive Tx also in copy mode */ __xsk_sendmsg(sk); -- 2.20.1