From patchwork Mon Dec 10 19:49:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cong Wang X-Patchwork-Id: 1010653 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Q8j6vHie"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43DDFH6sG0z9s4s for ; Tue, 11 Dec 2018 06:50:11 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729517AbeLJTuJ (ORCPT ); Mon, 10 Dec 2018 14:50:09 -0500 Received: from mail-pl1-f195.google.com ([209.85.214.195]:36924 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726962AbeLJTuJ (ORCPT ); Mon, 10 Dec 2018 14:50:09 -0500 Received: by mail-pl1-f195.google.com with SMTP id b5so5734778plr.4 for ; Mon, 10 Dec 2018 11:50:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=VM2wJ85CNB/3+03juTFZ7qjZmSVh6G5NPCBQgDrqU/8=; b=Q8j6vHiecg5qbLnoRvxkjkMGXfDLhZmInOHAxIkz/JDyHu85E0Kr9mFZXLZP/3CtcE INdDm/bG+3okuQcHO3yGnG1Zxe9eW2mXRdHjBi/oNtpCCIB43BAPmGNXU11q8t96EqL1 ReqoTPDkH1JCwVr9lNTSv2VjZMjZo5pREHFJjtKbwgXfKDMoaTow1vSYc7zguyHP53QZ 4jhl9nbUnmyqgbF6QKEqRfw83UT/ULR7xy+AQKR52toKo7xx8kiY/DAoX/ehuynQRkkq fGnXW/LCTpt3voZ/4o7Z0cugKzcYBw1TrEIWkUCmTNwBWTw+MQj4j2ub9qsn9K7P+tLd V2sw== 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:mime-version :content-transfer-encoding; bh=VM2wJ85CNB/3+03juTFZ7qjZmSVh6G5NPCBQgDrqU/8=; b=LVk83Ho/m48NVq8ScSD9bSa8/eYTt5BlpjHYrMEe7c0GGcFfIGC5rGS5WN7cwYwG3Z cK2TqX7aM4iPyloNp0AXu1+5Qv1xC1V4bc1Wx7EmsvyvLA5oolvH44Q7zakZZfBGQy03 Jh0acURtrgHsaHr8R0OqQvHkMT+Ssk9lkYNe4ltlE5Ew4rB9XXk/cfGwMLq/8wS7pL85 C9gUrd6tnQsNp7ZOnZkTlDtfE3a6X6KO4LassXONT7mK5UXViuA9n1LyaV01zsNJPOEr lhudpAuGp+fXCL+hEJH9iVSYEPmY0oyo2u60U+PlB+tKl06v4h9UQ+EHYw81Uah0I19h G7hw== X-Gm-Message-State: AA+aEWaq0/WYYEbfaFceiVc4BnXtXDhV7JL3K83HVreXapRgU1en0zIL 9lLp0NhJdUqoXOJcBcQU+NfHJrB4 X-Google-Smtp-Source: AFSGD/VsWwhFKB4Rx+JXI34bWWMkqvBjJ3r1J2WVBmuJzzLzqovH85SbhFEzG6ZpWqvVOm42KWDtTw== X-Received: by 2002:a17:902:780a:: with SMTP id p10mr13648078pll.54.1544471408704; Mon, 10 Dec 2018 11:50:08 -0800 (PST) Received: from tw-172-25-17-123.office.twttr.net ([8.25.197.27]) by smtp.gmail.com with ESMTPSA id y89sm18597848pfa.136.2018.12.10.11.50.07 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 10 Dec 2018 11:50:07 -0800 (PST) From: Cong Wang To: netdev@vger.kernel.org Cc: dvyukov@google.com, Cong Wang , Ying Xue , Jon Maloy Subject: [Patch net] tipc: use lock_sock() in tipc_sk_reinit() Date: Mon, 10 Dec 2018 11:49:55 -0800 Message-Id: <20181210194955.2213-1-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org lock_sock() must be used in process context to be race-free with other lock_sock() callers, for example, tipc_release(). Otherwise using the spinlock directly can't serialize a parallel tipc_release(). As it is blocking, we have to hold the sock refcnt before rhashtable_walk_stop() and release it after rhashtable_walk_start(). Fixes: 07f6c4bc048a ("tipc: convert tipc reference table to use generic rhashtable") Reported-by: Dmitry Vyukov Cc: Ying Xue Cc: Jon Maloy Signed-off-by: Cong Wang --- net/tipc/socket.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/tipc/socket.c b/net/tipc/socket.c index b57b1be7252b..e1396fb87779 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -2724,11 +2724,15 @@ void tipc_sk_reinit(struct net *net) rhashtable_walk_start(&iter); while ((tsk = rhashtable_walk_next(&iter)) && !IS_ERR(tsk)) { - spin_lock_bh(&tsk->sk.sk_lock.slock); + sock_hold(&tsk->sk); + rhashtable_walk_stop(&iter); + lock_sock(&tsk->sk); msg = &tsk->phdr; msg_set_prevnode(msg, tipc_own_addr(net)); msg_set_orignode(msg, tipc_own_addr(net)); - spin_unlock_bh(&tsk->sk.sk_lock.slock); + release_sock(&tsk->sk); + rhashtable_walk_start(&iter); + sock_put(&tsk->sk); } rhashtable_walk_stop(&iter);