From patchwork Fri Feb 16 05:20:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Selvin Xavier X-Patchwork-Id: 10224075 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id DD8C1603EE for ; Fri, 16 Feb 2018 05:21:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D046B2950A for ; Fri, 16 Feb 2018 05:21:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C192F29507; Fri, 16 Feb 2018 05:21:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5E18D29507 for ; Fri, 16 Feb 2018 05:21:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752699AbeBPFVa (ORCPT ); Fri, 16 Feb 2018 00:21:30 -0500 Received: from mail-qk0-f193.google.com ([209.85.220.193]:38972 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752642AbeBPFVU (ORCPT ); Fri, 16 Feb 2018 00:21:20 -0500 Received: by mail-qk0-f193.google.com with SMTP id z197so2483113qkb.6 for ; Thu, 15 Feb 2018 21:21:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=M6HDSk5S/vK3LbEI+voiICxLGmop5wcdu4UtsNp3ntA=; b=ZZr7L4qKkeLyaq89yYgs+EUCe5UuN/Px02J7r/0AdPWM3XIxLT5n9grXsdysaS9IXH rkS5qtRgE2eCbGr33G0P8uBKFR3DlQiLmkACCuiotusIPCAQyW3UZP0IMGSjzOMwv36g D336t/7xD6Y1oI6pJOATd70WRYnF0bI037Zfo= 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=M6HDSk5S/vK3LbEI+voiICxLGmop5wcdu4UtsNp3ntA=; b=fsTJ/IDUa+2vZ/ylWiBTzKXh6l+sHtlgq6Ip3D95TS3YvqRDWoXYD3wDiGOFdth6hi JGP7AToyn4JIQE/n2Vl0ASErd8x0elyZlUnALuo4DWMApYe1fF8lC2arqstTsYxYrRok cqsc4eehus4w8FGVp1ZAfZaw77JhdTdSTaVTERS2wSsIdIk5/htYchEbqa5pV6XeEpJJ 34AlKgJrMmjkemcRdGEPJwofLRn8v5l/R1DdRJV1aIfzS3hEvAJk6wuIy6FU+vex3G2i i1PDvHfjt5srf4VB683RqyOk+oBKQ2M0R43MPLxJhGg44u9Ctkx2gwx3kskjvQxWoNxN //LA== X-Gm-Message-State: APf1xPDJa04myMQyJs3CHr4BJMN1RnrW62YSHrHJV2Vnf5jHxsb10HNH XLdoOqwQzm7ebPM+dOemTVz/JK4x X-Google-Smtp-Source: AH8x227gyOJFjA3WjPDiv2YfCSjofmb8K7DVGOVqRkVo/ZTywnMp7jUb9VQgLcfcXU2ohUEr0Q3LmA== X-Received: by 10.55.1.78 with SMTP id 75mr705745qkb.310.1518758479886; Thu, 15 Feb 2018 21:21:19 -0800 (PST) Received: from dhcp-10-192-206-197.dhcp.broadcom.net ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id u4sm11257732qtg.28.2018.02.15.21.21.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 15 Feb 2018 21:21:19 -0800 (PST) From: Selvin Xavier To: dledford@redhat.com, jgg@ziepe.ca Cc: linux-rdma@vger.kernel.org, Selvin Xavier Subject: [PATCH for-rc 6/6] RDMA/bnxt_re: Avoid system hang during device un-reg Date: Thu, 15 Feb 2018 21:20:13 -0800 Message-Id: <1518758413-20850-7-git-send-email-selvin.xavier@broadcom.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1518758413-20850-1-git-send-email-selvin.xavier@broadcom.com> References: <1518758413-20850-1-git-send-email-selvin.xavier@broadcom.com> Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP BNXT_RE_FLAG_TASK_IN_PROG doesn't handle multiple work requests posted together. Track schedule of multiple workqueue items by maintaining a per device counter and proceed with IB dereg only if this counter is zero. flush_workqueue is no longer required from NETDEV_UNREGISTER path. Signed-off-by: Selvin Xavier --- drivers/infiniband/hw/bnxt_re/bnxt_re.h | 2 +- drivers/infiniband/hw/bnxt_re/main.c | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h index 5692335..7463067 100644 --- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h @@ -121,7 +121,6 @@ struct bnxt_re_dev { #define BNXT_RE_FLAG_HAVE_L2_REF 3 #define BNXT_RE_FLAG_RCFW_CHANNEL_EN 4 #define BNXT_RE_FLAG_QOS_WORK_REG 5 -#define BNXT_RE_FLAG_TASK_IN_PROG 6 #define BNXT_RE_FLAG_ISSUE_ROCE_STATS 29 struct net_device *netdev; unsigned int version, major, minor; @@ -159,6 +158,7 @@ struct bnxt_re_dev { atomic_t srq_count; atomic_t mr_count; atomic_t mw_count; + atomic_t sched_count; /* Max of 2 lossless traffic class supported per port */ u16 cosq[2]; diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c index 560520c..b1aa5a7 100644 --- a/drivers/infiniband/hw/bnxt_re/main.c +++ b/drivers/infiniband/hw/bnxt_re/main.c @@ -656,7 +656,6 @@ static void bnxt_re_dev_remove(struct bnxt_re_dev *rdev) mutex_unlock(&bnxt_re_dev_lock); synchronize_rcu(); - flush_workqueue(bnxt_re_wq); kfree(rdev->gid_map); ib_dealloc_device(&rdev->ibdev); @@ -1454,7 +1453,7 @@ static void bnxt_re_task(struct work_struct *work) break; } smp_mb__before_atomic(); - clear_bit(BNXT_RE_FLAG_TASK_IN_PROG, &rdev->flags); + atomic_dec(&rdev->sched_count); kfree(re_work); } @@ -1516,7 +1515,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier, /* netdev notifier will call NETDEV_UNREGISTER again later since * we are still holding the reference to the netdev */ - if (test_bit(BNXT_RE_FLAG_TASK_IN_PROG, &rdev->flags)) + if (atomic_read(&rdev->sched_count) > 0) goto exit; bnxt_re_ib_unreg(rdev, false); bnxt_re_remove_one(rdev); @@ -1536,7 +1535,7 @@ static int bnxt_re_netdev_event(struct notifier_block *notifier, re_work->vlan_dev = (real_dev == netdev ? NULL : netdev); INIT_WORK(&re_work->work, bnxt_re_task); - set_bit(BNXT_RE_FLAG_TASK_IN_PROG, &rdev->flags); + atomic_inc(&rdev->sched_count); queue_work(bnxt_re_wq, &re_work->work); } }