From patchwork Fri Dec 22 19:47:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 852548 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="EZAoa15A"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z3Jw710m5z9ryr for ; Sat, 23 Dec 2017 06:48:23 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756410AbdLVTsS (ORCPT ); Fri, 22 Dec 2017 14:48:18 -0500 Received: from mail-pl0-f68.google.com ([209.85.160.68]:44186 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756167AbdLVTsR (ORCPT ); Fri, 22 Dec 2017 14:48:17 -0500 Received: by mail-pl0-f68.google.com with SMTP id n13so13459183plp.11 for ; Fri, 22 Dec 2017 11:48:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IPvzcge6px4dWYKCJ1qiij30+7Z+dQJJclOnCL9Zqdk=; b=EZAoa15ASI3/jDF0n5rpHP094tWulqVR3wUCVr2uQdmbTjMCbvpVlWD3x/OkBsR/ay mS+e8Ov3/+TW1CKqH7lmMc2Aqml0n00szEP8v2XS3+NaiNglAXdhCy0OqRbu0Hhtm+Kh ofQPD1Dp3HJhO3usCP2ZIrxxc+OOkClq6cnm7wHKQYoM5u4s5RSDZH6fL/Vx4M2Hc3Tn zPNw2s3CEMiy6kv+p9f2oOc95vJUL1SdtqOl+kIKx0yeaPxmx1fXj9nqPRFNMiobFY5u Qenj7q03NIqmemZDJRZ/ls9tEnnPFOjsmY+hk9kT9yHheJYGyIAs2tp551vld1qm1fxC lW/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=IPvzcge6px4dWYKCJ1qiij30+7Z+dQJJclOnCL9Zqdk=; b=kjdW+6l4rjg46HAkNsdZlfbqFD/UJuHgeOtYLmxDbVNxDjMirQx6OjsrldLQzgbF6C JxkiFbMrvITFB7x/JDLPolT6iDvlBN6Y9M0RXoFdWhvZemBbtjNqq/WA+i2t7Sj+qKh3 1W+7rd0v6S2QmyzIHAmpkbiw1bx+q+pxzQaDPT2Oqt2IhSQPIbe5ZOGIoT3VDm6Xs9KO J74WTUnPMmCZeVkixmWeZVTVxvJXNsVdx9FlmKPegM8hUTcjwmx7XcfmcHF2HELHx7XI 5UTB1I+HLqobUn4ZTuelc3hTQA6k+kYPMnEA1t2A5EXk82GCJMEZI0OkPJSGyvWn1EF1 PJRQ== X-Gm-Message-State: AKGB3mI/9vYPXL9bgM3AdXYgK3oZSYAOhZvu7cKM2j4k7LCJmLn4xEB9 4wEZsSH/DUsdQFQLOTAabCoxfA== X-Google-Smtp-Source: ACJfBouQs0Y+YrV2dFyoagUZ3kbaYVuFAFOWITDgaibEckppBvMFZPVgqzqpxTvtfMgNKKPRChciqw== X-Received: by 10.84.248.1 with SMTP id p1mr14993034pll.50.1513972096808; Fri, 22 Dec 2017 11:48:16 -0800 (PST) Received: from localhost.localdomain (c-73-162-13-107.hsd1.ca.comcast.net. [73.162.13.107]) by smtp.gmail.com with ESMTPSA id e7sm50080812pfj.44.2017.12.22.11.48.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Dec 2017 11:48:15 -0800 (PST) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, dvyukov@google.com, john.fastabend@gmail.com, rohit@quantonium.net, Tom Herbert Subject: [PATCH net-next 1/4] sock: Add sock_owned_by_user_nocheck Date: Fri, 22 Dec 2017 11:47:52 -0800 Message-Id: <20171222194755.8544-2-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171222194755.8544-1-tom@quantonium.net> References: <20171222194755.8544-1-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This allows checking socket lock ownership with producing lockdep warnings. Signed-off-by: Tom Herbert --- include/net/sock.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/net/sock.h b/include/net/sock.h index 0a32f3ce381c..3b4ca2046f8c 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1515,6 +1515,11 @@ static inline bool sock_owned_by_user(const struct sock *sk) return sk->sk_lock.owned; } +static inline bool sock_owned_by_user_nocheck(const struct sock *sk) +{ + return sk->sk_lock.owned; +} + /* no reclassification while locks are held */ static inline bool sock_allow_reclassification(const struct sock *csk) { From patchwork Fri Dec 22 19:47:53 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 852549 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="IUoA5TAL"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z3JwB1svfz9ryr for ; Sat, 23 Dec 2017 06:48:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756578AbdLVTsW (ORCPT ); Fri, 22 Dec 2017 14:48:22 -0500 Received: from mail-pl0-f66.google.com ([209.85.160.66]:37359 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756473AbdLVTsU (ORCPT ); Fri, 22 Dec 2017 14:48:20 -0500 Received: by mail-pl0-f66.google.com with SMTP id s3so13442240plp.4 for ; Fri, 22 Dec 2017 11:48:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6+EjW6V+4nFuc4dlrdakJzaTAbCh3oBmQE5rg1uY9is=; b=IUoA5TALr1tNug/wnKJwufZYGc80opGNCDp2Rb600sghERhkosLusdqjVp0Dt97Njb szWhnQOXvLF3P+fk1j5Tn2ptGJUuNwwDucVciNWVIqz0Tk2sj/R53aQaj9vBzt8k9o/i McYwUH0THp25dRazDMyJHaaXeCZhEp6NO51astzmHHwqZJfXFJvbQZWpwxsvOBKuaoJP qMxppkKNiLJhVc36ULGNv732Umpx6PGvSum9rlZRKpiX4x1e4wmWZinJ+mds0/R2nec8 sf7eNDtCL1g1mSw3rJ4dx7L1AmO0PLDQjS1msd25fJxyC1hkrHAWLDZBkvEDyXXRBGie cwQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6+EjW6V+4nFuc4dlrdakJzaTAbCh3oBmQE5rg1uY9is=; b=qn4NKCOCe7c5gBzK2NH6efKswolvcaiNdAu2ZSeg9ezA7pdcNNsiHBlqxo4W32hJ7C EX1fB+LcvarzQyToi5gOOoTfe3oyZmEPhXg5CnTELJi/NMdwcxm50BS7wNFMMc8/zBbt uGp7KRJTXeN9kAu0Cc7jFqvFeEyqeA6WWpCO9NEwTSjSGtJwJtGJf068nkRw7iNaTtaK C1+P2ZS6zJ5hQ+isJi6r20Be6Ku+iibchIGxrkg5z1DTZrUSEXHgRj9iV2FcAslXLh9C 4ChdEChzdPNcwuHq90vXuy1hGrGIxgEqqigFwTEwYHv0vrlUkrm1JbeEWBLQVrYgBT+T 78XA== X-Gm-Message-State: AKGB3mIKwIOribVYUkhOaGHM56jOsNIzhROo9Pjy+yfrEO7Zq49ywf0E uafVzZLN1y5FSHmYoZsjG09zbg== X-Google-Smtp-Source: ACJfBovPBFY0m5mh2LtB6sTj9obYCZEKZY0YSxqazWIXAeoG+fCxq+Wv9DOuAQfktfzCVxYAuX6pRw== X-Received: by 10.84.131.103 with SMTP id 94mr14861193pld.288.1513972099853; Fri, 22 Dec 2017 11:48:19 -0800 (PST) Received: from localhost.localdomain (c-73-162-13-107.hsd1.ca.comcast.net. [73.162.13.107]) by smtp.gmail.com with ESMTPSA id e7sm50080812pfj.44.2017.12.22.11.48.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Dec 2017 11:48:18 -0800 (PST) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, dvyukov@google.com, john.fastabend@gmail.com, rohit@quantonium.net, Tom Herbert Subject: [PATCH net-next 2/4] strparser: Call sock_owned_by_user_nocheck Date: Fri, 22 Dec 2017 11:47:53 -0800 Message-Id: <20171222194755.8544-3-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171222194755.8544-1-tom@quantonium.net> References: <20171222194755.8544-1-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org strparser wants to check socket ownership without producing any warnings. As indicated by the comment in the code, it is permissible for owned_by_user to return true. Fixes: 43a0c6751a322847 ("strparser: Stream parser for messages") Reported-by: syzbot Signed-off-by: Tom Herbert --- net/strparser/strparser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c index c5fda15ba319..1fdab5c4eda8 100644 --- a/net/strparser/strparser.c +++ b/net/strparser/strparser.c @@ -401,7 +401,7 @@ void strp_data_ready(struct strparser *strp) * allows a thread in BH context to safely check if the process * lock is held. In this case, if the lock is held, queue work. */ - if (sock_owned_by_user(strp->sk)) { + if (sock_owned_by_user_nocheck(strp->sk)) { queue_work(strp_wq, &strp->work); return; } From patchwork Fri Dec 22 19:47:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 852550 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="lXtNSOt6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z3JwC5xR9z9ryr for ; Sat, 23 Dec 2017 06:48:27 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756716AbdLVTsZ (ORCPT ); Fri, 22 Dec 2017 14:48:25 -0500 Received: from mail-pl0-f66.google.com ([209.85.160.66]:34677 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756515AbdLVTsW (ORCPT ); Fri, 22 Dec 2017 14:48:22 -0500 Received: by mail-pl0-f66.google.com with SMTP id d21so13448848pll.1 for ; Fri, 22 Dec 2017 11:48:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=i6gpgGexekXDgCc9wKLelDFvDZ141OcpU0zEo9lO9Ek=; b=lXtNSOt64TAW32og6rYDzvL8zaBrt30E7rClMTnyFR1y0w7W0FqMyIjsqFCMYtDwR1 bj4plL6LBOiWnAPP0vWIPWwQVfY0gLoNpinaVfFeRbmFeZWs34rL3BCcYfLngM1tHLC9 VT60wCZsjv45joaqu0+yOs1kFPhwXPJelHHwFptKK9XkLyqZxqpHL2J3FtdEtHq49s0a 5jdVJYqfvpjEBnVaw3hoP2VGD2zKxGAZqhHw/WATfNpn9LkjMKrdNNu6cfbmlWaYDv7Y hdjJxysg2QaEXR60jFXQdzLMXNgfSX3qExZRySOQsrxmpvN03ODFl0GU4hzDzpLSyPs3 Qbfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=i6gpgGexekXDgCc9wKLelDFvDZ141OcpU0zEo9lO9Ek=; b=HMoywdo55psNw9D0CNuyDC6gCBkYyHToaBMBTEBgnU8b8NMgUQiic8JumkoEEMdnj6 LbyWOFkTBpSbGaxcfhqL/oh4JKBCR2aEcXL9hC7bxCTiG2Yj07I526FollsZjfQs1FbB ud8Hf/MORVgs0WnoNb0mAhP/xgJ8ZlePS3sKiXnwd+vjzLB2NqIE/V1HBumHtAYoD0ss nkFKqNT4/qV5uq54CjDegvRkdW61xdJ2aPEQAkzGGOSSMoL5I23Je50ckkD/tU9GSIJn /JCEeXOW/mav128qPL+UAnCTcuzBMnKnLMbarzQo+/n3KqDWI6xrvpfvY0k5A427bqQV o2ew== X-Gm-Message-State: AKGB3mKdF2oh1jL0erASbZqxnt4pWOfa2r8g4//S7xIJ8UyL+GDCjdT3 H4MHnhmkKLwh/4YOefhd9DVRhA== X-Google-Smtp-Source: ACJfBotgVK/C7CBE9G0r9n4QuPcHKUJZ6HyMuNjB3vuAjtzEUYl7LkmPRlcKXPnj+31LIAqOBnYECw== X-Received: by 10.84.134.34 with SMTP id 31mr15097270plg.382.1513972102265; Fri, 22 Dec 2017 11:48:22 -0800 (PST) Received: from localhost.localdomain (c-73-162-13-107.hsd1.ca.comcast.net. [73.162.13.107]) by smtp.gmail.com with ESMTPSA id e7sm50080812pfj.44.2017.12.22.11.48.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Dec 2017 11:48:21 -0800 (PST) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, dvyukov@google.com, john.fastabend@gmail.com, rohit@quantonium.net, Tom Herbert Subject: [PATCH net-next 3/4] sock_lock: Add try_sock_lock Date: Fri, 22 Dec 2017 11:47:54 -0800 Message-Id: <20171222194755.8544-4-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171222194755.8544-1-tom@quantonium.net> References: <20171222194755.8544-1-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org try_sock lock is an opportunistic attempt to acquire a socket lock without blocking or sleeping. If the socket lock is acquired then true is returned, else false is returned. Signed-off-by: Tom Herbert --- include/net/sock.h | 7 +++++++ net/core/sock.c | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/net/sock.h b/include/net/sock.h index 3b4ca2046f8c..69fdd1a89591 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1462,6 +1462,13 @@ static inline void lock_sock(struct sock *sk) lock_sock_nested(sk, 0); } +bool try_lock_sock_nested(struct sock *sk, int subclass); + +static inline bool try_lock_sock(struct sock *sk) +{ + return try_lock_sock_nested(sk, 0); +} + void release_sock(struct sock *sk); /* BH context may only use the following locking interface. */ diff --git a/net/core/sock.c b/net/core/sock.c index 72d14b221784..40fb772e2d52 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2782,6 +2782,26 @@ void lock_sock_nested(struct sock *sk, int subclass) } EXPORT_SYMBOL(lock_sock_nested); +bool try_lock_sock_nested(struct sock *sk, int subclass) +{ + spin_lock_bh(&sk->sk_lock.slock); + if (sk->sk_lock.owned) { + spin_unlock_bh(&sk->sk_lock.slock); + return false; + } + + sk->sk_lock.owned = 1; + spin_unlock(&sk->sk_lock.slock); + + /* The sk_lock has mutex_lock() semantics here: */ + + mutex_acquire(&sk->sk_lock.dep_map, subclass, 0, _RET_IP_); + local_bh_enable(); + + return true; +} +EXPORT_SYMBOL(try_lock_sock_nested); + void release_sock(struct sock *sk) { spin_lock_bh(&sk->sk_lock.slock); From patchwork Fri Dec 22 19:47:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 852551 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="xjlcPJ+t"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z3JwK1Gvdz9ryr for ; Sat, 23 Dec 2017 06:48:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756764AbdLVTsa (ORCPT ); Fri, 22 Dec 2017 14:48:30 -0500 Received: from mail-pf0-f193.google.com ([209.85.192.193]:38306 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756473AbdLVTsZ (ORCPT ); Fri, 22 Dec 2017 14:48:25 -0500 Received: by mail-pf0-f193.google.com with SMTP id u25so15679403pfg.5 for ; Fri, 22 Dec 2017 11:48:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=KMVzAU6i/3hXlPPm7mVEvbIeFg3ZNgwYwwZ2sRA+n4M=; b=xjlcPJ+tZUQMDQEinxQQ0PXdqOdmKTJlIDdY0Tw+o/DHtgl7K6xyshm3UvlVTgq8wf S1gE17W1G4iM6kx6QuCjbS+0AiTpCTypFQ0idiIbA7evTQnBKL8o8+ufz2B8eJw+Gygi 0fWOMUVQhUIhicBlBdowma1WT27+fYHOfsuMB5RPQZ9mgs2K+Xe8oBezcCxf09+uDuFD AIB82iRjLTh1qiTK9ShpB0N7I7zBu2F6oOOr1cllBRGT6GE/t3FQJ7f3M5Lp1bxzo32s 9pbAoBJwNS6FF4LLcvMQZTnltqbwzvUds2/EGRrHVhgflHPxc03XNmN3Z8Pchaf96NZr sGqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=KMVzAU6i/3hXlPPm7mVEvbIeFg3ZNgwYwwZ2sRA+n4M=; b=Wkak9b0GXGjhvTyLHWqNjnBmzew03IAEWEAJTZQyxYAticuugz3gs8+g6Chpmv9E3y LwZ86tHlgnc5mH0O5AopjsLNmPIRN8VqPTqcyw9FQok7J1bfXAnhlm6uPKiGk+ZFEmnC aPCyfwKzCnm1ar0kGgch1g+pXiHB/W24hZ+jBGrILAhkDzyxuwTcxSDFCzS94b5xoK5E BaXpbechB1VFZIsnK8k0aV1HKPs1p3KGMkgQTJ1jWawSIu9iddhZvYflx4AsWjR6iJCb Dpc7mzKbcgC+9fe8UCWipxxTqj3FsH+lzQ/ue9eWBlYek/Eco6i4dtahbYdA0yYA9akk RCfw== X-Gm-Message-State: AKGB3mIFvxCDQAEw469rHxsUG+W5gzU3WCdhPR2Nrae/P+dRsGwnZVSB TUBqYSO033H939kJba+H3H+J1g== X-Google-Smtp-Source: ACJfBosD5KPoJTjs/DiLmVBzRN4s/qOukMQwgHXS4hqzUjYTKi7q0zBBO2/R+UdUf2mywH0YFxMDBA== X-Received: by 10.98.247.16 with SMTP id h16mr15272302pfi.242.1513972104587; Fri, 22 Dec 2017 11:48:24 -0800 (PST) Received: from localhost.localdomain (c-73-162-13-107.hsd1.ca.comcast.net. [73.162.13.107]) by smtp.gmail.com with ESMTPSA id e7sm50080812pfj.44.2017.12.22.11.48.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Dec 2017 11:48:23 -0800 (PST) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, dvyukov@google.com, john.fastabend@gmail.com, rohit@quantonium.net, Tom Herbert Subject: [PATCH net-next 4/4] kcm: Address deadlock between TX and RX paths Date: Fri, 22 Dec 2017 11:47:55 -0800 Message-Id: <20171222194755.8544-5-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171222194755.8544-1-tom@quantonium.net> References: <20171222194755.8544-1-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Both the transmit and receive paths of KCM need to take both the KCM socket lock and the psock socket lock, however they take the locks in opposite order which can lead to deadlock. This patch changes the transmit path (kcm_write_msgs to be specific) so the locks are taken in the proper order. try_sock_lock is first used to get the lower socket lock, if that is successful then sending data can proceed with dropping KCM lock. If try_sock_lock fails then the KCM lock is released and lock_sock is done on the lower socket followed by the lock_sock on the KCM sock. A doing_write_msgs flag has been added to kcm structure to prevent multiple threads doing write_msgs when the KCM lock is dropped. kernel_sendpage_locked is now called to do the send data with lock already held. Signed-off-by: Tom Herbert --- include/net/kcm.h | 1 + net/kcm/kcmsock.c | 64 ++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/include/net/kcm.h b/include/net/kcm.h index 2a8965819db0..22bd7dd3eedb 100644 --- a/include/net/kcm.h +++ b/include/net/kcm.h @@ -78,6 +78,7 @@ struct kcm_sock { /* Don't use bit fields here, these are set under different locks */ bool tx_wait; bool tx_wait_more; + bool doing_write_msgs; /* Receive */ struct kcm_psock *rx_psock; diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index d4e98f20fc2a..3eb3179b96b3 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c @@ -574,13 +574,19 @@ static void kcm_report_tx_retry(struct kcm_sock *kcm) static int kcm_write_msgs(struct kcm_sock *kcm) { struct sock *sk = &kcm->sk; - struct kcm_psock *psock; - struct sk_buff *skb, *head; - struct kcm_tx_msg *txm; + struct sk_buff *head = skb_peek(&sk->sk_write_queue); unsigned short fragidx, frag_offset; unsigned int sent, total_sent = 0; + struct kcm_psock *psock; + struct kcm_tx_msg *txm; + struct sk_buff *skb; int ret = 0; + if (unlikely(kcm->doing_write_msgs)) + return 0; + + kcm->doing_write_msgs = true; + kcm->tx_wait_more = false; psock = kcm->tx_psock; if (unlikely(psock && psock->tx_stopped)) { @@ -598,15 +604,36 @@ static int kcm_write_msgs(struct kcm_sock *kcm) return 0; } +try_again: + psock = reserve_psock(kcm); + if (!psock) + goto out_no_release_psock; + + /* Get lock for lower sock */ + if (!try_lock_sock(psock->sk)) { + /* Someone else is holding the lower sock lock. We need to + * release the KCM lock and get the psock lock first. This is + * needed since the receive path obtains the locks in reverse + * order and we want to avoid deadlock. Note that + * write_msgs can't be reentered when we drop the KCM lock + * since doing_write_msgs is set. + */ + release_sock(&kcm->sk); + + /* Take locks in order that receive path does */ + lock_sock(psock->sk); + lock_sock(&kcm->sk); + } + + /* At this point we have a reserved psock and its lower socket is + * locked. + */ + head = skb_peek(&sk->sk_write_queue); txm = kcm_tx_msg(head); if (txm->sent) { /* Send of first skbuff in queue already in progress */ - if (WARN_ON(!psock)) { - ret = -EINVAL; - goto out; - } sent = txm->sent; frag_offset = txm->frag_offset; fragidx = txm->fragidx; @@ -615,11 +642,6 @@ static int kcm_write_msgs(struct kcm_sock *kcm) goto do_frag; } -try_again: - psock = reserve_psock(kcm); - if (!psock) - goto out; - do { skb = head; txm = kcm_tx_msg(head); @@ -643,11 +665,12 @@ static int kcm_write_msgs(struct kcm_sock *kcm) goto out; } - ret = kernel_sendpage(psock->sk->sk_socket, - frag->page.p, - frag->page_offset + frag_offset, - frag->size - frag_offset, - MSG_DONTWAIT); + ret = kernel_sendpage_locked(psock->sk, frag->page.p, + frag->page_offset + + frag_offset, + frag->size - + frag_offset, + MSG_DONTWAIT); if (ret <= 0) { if (ret == -EAGAIN) { /* Save state to try again when there's @@ -669,6 +692,7 @@ static int kcm_write_msgs(struct kcm_sock *kcm) */ kcm_abort_tx_psock(psock, ret ? -ret : EPIPE, true); + release_sock(psock->sk); unreserve_psock(kcm); txm->sent = 0; @@ -704,7 +728,13 @@ static int kcm_write_msgs(struct kcm_sock *kcm) total_sent += sent; KCM_STATS_INCR(psock->stats.tx_msgs); } while ((head = skb_peek(&sk->sk_write_queue))); + out: + release_sock(psock->sk); + +out_no_release_psock: + kcm->doing_write_msgs = false; + if (!head) { /* Done with all queued messages. */ WARN_ON(!skb_queue_empty(&sk->sk_write_queue));