Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3390024ybp; Sun, 6 Oct 2019 10:52:50 -0700 (PDT) X-Google-Smtp-Source: APXvYqzKe5Z2UGCqLLQ5IP/jOsEI3AWVYo1iXUtlPtyvQ6LBloZK4D55yZZPleqH+0RRgR+Ws7vK X-Received: by 2002:a17:906:b259:: with SMTP id ce25mr19910764ejb.229.1570384370626; Sun, 06 Oct 2019 10:52:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570384370; cv=none; d=google.com; s=arc-20160816; b=gkFt0aK1hwSb9ZOAgfO9EgoPj0AccoVxQyIB+md0/fwI1V0DjOqhen9r23rwt8wv3h Xw4Z2pxM430ocIIaNC7YGtwbEGlOvy5SFMVpun9d3zlnV8HfC3T0yBKqh9wTK5s+urmn 8fFZ4FdmK11BIde0e4/3wjQL3Xd4oBeSvQRHk5PgCPAmB99Bvkoe+HK+vQ2CRlGpqMGh iXRqnHZJXQBuTIFs1HEC0Mo/TrxHQLCsLJBp8W/uqW8zAP6nevQjJNBZkBHlt7ZdGXOe aWNAF40NrmH21txu0XSHnYClR7b/cyQCZZDr191XXkyNoVhEFy9fYVeNyB/lcairOZmX 9V2g== 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=XZ+D/ytkDdmQdX4TLVA9m2flIT8K+Rk+mczbtqrW6Xw=; b=Lisnx5GiKDe85106A/CCNr71p7fZkhN39L4VPc/L9Bf7w5ZOqndsJQulrAeZpVZzoU +9e88BklBDJe5TaqFHMse7oPwunn7Wt3SG/zypW4hqOUPG5OYrX+YjWt73ohJ61JKpyB /XUtf5GXubteGDyux5MAWTepJVNEGgkz3aCI7N09phHRSKmi0SsNZFwSct9Qxkf9kLdS 8A5gUmILCfr0TX4Wfmki3Bf0Xv3LInzPyi0LsMxLVnE6IAMp5bUkXgqiAYXtT86qsfUo ULKEoACrsI8sbIBHHSEL2t5uKKL5690wgzNqT8CW/xaxmrsNhcBZVLan8VUyHyyDtSKg 5RNw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="w547f/6w"; 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 i5si7875419edj.107.2019.10.06.10.52.27; Sun, 06 Oct 2019 10:52:50 -0700 (PDT) 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="w547f/6w"; 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 S1728371AbfJFRvf (ORCPT + 99 others); Sun, 6 Oct 2019 13:51:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:49018 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728792AbfJFRu5 (ORCPT ); Sun, 6 Oct 2019 13:50:57 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 7BC3C20862; Sun, 6 Oct 2019 17:45:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570383917; bh=ZVHW6+BSAJW1fQbbjaxtl+F6QNhxgX+j9GkD3KFFs5w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=w547f/6wF5enAhgrS8+lhe2YVFuvNoCm6pMbhWsW2DJoiARW00hwq8Ictxq2ZDNRb 4m4FUJzMzN+fffGNa6Bsiw5K6VcsDCYeCateK3PHsi+cLV2fqXHsEAZ6ejPGTpxyHm DteaAtXt470TILFTVza6GMp17Xen7vo1T8gCnopw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Stefano Garzarella , Dexuan Cui , "David S. Miller" Subject: [PATCH 5.3 144/166] vsock: Fix a lockdep warning in __vsock_release() Date: Sun, 6 Oct 2019 19:21:50 +0200 Message-Id: <20191006171225.112208344@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171212.850660298@linuxfoundation.org> References: <20191006171212.850660298@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: Dexuan Cui [ Upstream commit 0d9138ffac24cf8b75366ede3a68c951e6dcc575 ] Lockdep is unhappy if two locks from the same class are held. Fix the below warning for hyperv and virtio sockets (vmci socket code doesn't have the issue) by using lock_sock_nested() when __vsock_release() is called recursively: ============================================ WARNING: possible recursive locking detected 5.3.0+ #1 Not tainted -------------------------------------------- server/1795 is trying to acquire lock: ffff8880c5158990 (sk_lock-AF_VSOCK){+.+.}, at: hvs_release+0x10/0x120 [hv_sock] but task is already holding lock: ffff8880c5158150 (sk_lock-AF_VSOCK){+.+.}, at: __vsock_release+0x2e/0xf0 [vsock] other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(sk_lock-AF_VSOCK); lock(sk_lock-AF_VSOCK); *** DEADLOCK *** May be due to missing lock nesting notation 2 locks held by server/1795: #0: ffff8880c5d05ff8 (&sb->s_type->i_mutex_key#10){+.+.}, at: __sock_release+0x2d/0xa0 #1: ffff8880c5158150 (sk_lock-AF_VSOCK){+.+.}, at: __vsock_release+0x2e/0xf0 [vsock] stack backtrace: CPU: 5 PID: 1795 Comm: server Not tainted 5.3.0+ #1 Call Trace: dump_stack+0x67/0x90 __lock_acquire.cold.67+0xd2/0x20b lock_acquire+0xb5/0x1c0 lock_sock_nested+0x6d/0x90 hvs_release+0x10/0x120 [hv_sock] __vsock_release+0x24/0xf0 [vsock] __vsock_release+0xa0/0xf0 [vsock] vsock_release+0x12/0x30 [vsock] __sock_release+0x37/0xa0 sock_close+0x14/0x20 __fput+0xc1/0x250 task_work_run+0x98/0xc0 do_exit+0x344/0xc60 do_group_exit+0x47/0xb0 get_signal+0x15c/0xc50 do_signal+0x30/0x720 exit_to_usermode_loop+0x50/0xa0 do_syscall_64+0x24e/0x270 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x7f4184e85f31 Tested-by: Stefano Garzarella Signed-off-by: Dexuan Cui Reviewed-by: Stefano Garzarella Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/vmw_vsock/af_vsock.c | 16 ++++++++++++---- net/vmw_vsock/hyperv_transport.c | 2 +- net/vmw_vsock/virtio_transport_common.c | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -638,7 +638,7 @@ struct sock *__vsock_create(struct net * } EXPORT_SYMBOL_GPL(__vsock_create); -static void __vsock_release(struct sock *sk) +static void __vsock_release(struct sock *sk, int level) { if (sk) { struct sk_buff *skb; @@ -648,9 +648,17 @@ static void __vsock_release(struct sock vsk = vsock_sk(sk); pending = NULL; /* Compiler warning. */ + /* The release call is supposed to use lock_sock_nested() + * rather than lock_sock(), if a sock lock should be acquired. + */ transport->release(vsk); - lock_sock(sk); + /* When "level" is SINGLE_DEPTH_NESTING, use the nested + * version to avoid the warning "possible recursive locking + * detected". When "level" is 0, lock_sock_nested(sk, level) + * is the same as lock_sock(sk). + */ + lock_sock_nested(sk, level); sock_orphan(sk); sk->sk_shutdown = SHUTDOWN_MASK; @@ -659,7 +667,7 @@ static void __vsock_release(struct sock /* Clean up any sockets that never were accepted. */ while ((pending = vsock_dequeue_accept(sk)) != NULL) { - __vsock_release(pending); + __vsock_release(pending, SINGLE_DEPTH_NESTING); sock_put(pending); } @@ -708,7 +716,7 @@ EXPORT_SYMBOL_GPL(vsock_stream_has_space static int vsock_release(struct socket *sock) { - __vsock_release(sock->sk); + __vsock_release(sock->sk, 0); sock->sk = NULL; sock->state = SS_FREE; --- a/net/vmw_vsock/hyperv_transport.c +++ b/net/vmw_vsock/hyperv_transport.c @@ -559,7 +559,7 @@ static void hvs_release(struct vsock_soc struct sock *sk = sk_vsock(vsk); bool remove_sock; - lock_sock(sk); + lock_sock_nested(sk, SINGLE_DEPTH_NESTING); remove_sock = hvs_close_lock_held(vsk); release_sock(sk); if (remove_sock) --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -790,7 +790,7 @@ void virtio_transport_release(struct vso struct sock *sk = &vsk->sk; bool remove_sock = true; - lock_sock(sk); + lock_sock_nested(sk, SINGLE_DEPTH_NESTING); if (sk->sk_type == SOCK_STREAM) remove_sock = virtio_transport_close(vsk);