From owner-dev-commits-src-main@freebsd.org Wed Sep 1 23:07:37 2021 Return-Path: Delivered-To: dev-commits-src-main@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 87C53673630; Wed, 1 Sep 2021 23:07:37 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4H0KTP25l8z4yJL; Wed, 1 Sep 2021 23:07:37 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 2109B5E44; Wed, 1 Sep 2021 23:07:37 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 181N7b1s020875; Wed, 1 Sep 2021 23:07:37 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 181N7bhH020874; Wed, 1 Sep 2021 23:07:37 GMT (envelope-from git) Date: Wed, 1 Sep 2021 23:07:37 GMT Message-Id: <202109012307.181N7bhH020874@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Marcin Wojtas Subject: git: cb98c439d66c - main - ena: Add locking assertions MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mw X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: cb98c439d66c303353a9f4abbbe9ddb51559c638 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-main@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for the main branch of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Sep 2021 23:07:37 -0000 The branch main has been updated by mw: URL: https://cgit.FreeBSD.org/src/commit/?id=cb98c439d66c303353a9f4abbbe9ddb51559c638 commit cb98c439d66c303353a9f4abbbe9ddb51559c638 Author: Artur Rojek AuthorDate: 2021-08-12 08:34:26 +0000 Commit: Marcin Wojtas CommitDate: 2021-09-01 23:06:21 +0000 ena: Add locking assertions ENA silently assumed that ena_up, ena_down and ena_start_xmit routines should be called within locked context. Driver's logic heavily assumes on concurrent access to those routines, so for safety and better documentation about this assumption, the locking assertions were added to the above functions. The assertion was added only for the main steps (skipping the helper functions) which can be called from multiple places including the kernel and the driver itself. Obtained from: Semihalf MFC after: 2 weeks Sponsored by: Amazon, Inc. --- sys/dev/ena/ena.c | 4 ++++ sys/dev/ena/ena.h | 4 ++++ sys/dev/ena/ena_datapath.c | 2 ++ 3 files changed, 10 insertions(+) diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c index dbe5b9f785a9..faa1278c6d81 100644 --- a/sys/dev/ena/ena.c +++ b/sys/dev/ena/ena.c @@ -2092,6 +2092,8 @@ ena_up(struct ena_adapter *adapter) { int rc = 0; + ENA_LOCK_ASSERT(adapter); + if (unlikely(device_is_attached(adapter->pdev) == 0)) { ena_log(adapter->pdev, ERR, "device is not attached!\n"); return (ENXIO); @@ -2465,6 +2467,8 @@ ena_down(struct ena_adapter *adapter) { int rc; + ENA_LOCK_ASSERT(adapter); + if (!ENA_FLAG_ISSET(ENA_FLAG_DEV_UP, adapter)) return; diff --git a/sys/dev/ena/ena.h b/sys/dev/ena/ena.h index 1d06a3cb56de..f05c2d69fbe4 100644 --- a/sys/dev/ena/ena.h +++ b/sys/dev/ena/ena.h @@ -480,12 +480,16 @@ struct ena_adapter { #define ENA_RING_MTX_LOCK(_ring) mtx_lock(&(_ring)->ring_mtx) #define ENA_RING_MTX_TRYLOCK(_ring) mtx_trylock(&(_ring)->ring_mtx) #define ENA_RING_MTX_UNLOCK(_ring) mtx_unlock(&(_ring)->ring_mtx) +#define ENA_RING_MTX_ASSERT(_ring) \ + mtx_assert(&(_ring)->ring_mtx, MA_OWNED) #define ENA_LOCK_INIT(adapter) \ sx_init(&(adapter)->global_lock, "ENA global lock") #define ENA_LOCK_DESTROY(adapter) sx_destroy(&(adapter)->global_lock) #define ENA_LOCK_LOCK(adapter) sx_xlock(&(adapter)->global_lock) #define ENA_LOCK_UNLOCK(adapter) sx_unlock(&(adapter)->global_lock) +#define ENA_LOCK_ASSERT(adapter) \ + sx_assert(&(adapter)->global_lock, SA_XLOCKED) #define clamp_t(type, _x, min, max) min_t(type, max_t(type, _x, min), max) #define clamp_val(val, lo, hi) clamp_t(__typeof(val), val, lo, hi) diff --git a/sys/dev/ena/ena_datapath.c b/sys/dev/ena/ena_datapath.c index e6286ebfc25f..6506c808e4cb 100644 --- a/sys/dev/ena/ena_datapath.c +++ b/sys/dev/ena/ena_datapath.c @@ -1075,6 +1075,8 @@ ena_start_xmit(struct ena_ring *tx_ring) int ena_qid; int ret = 0; + ENA_RING_MTX_ASSERT(tx_ring); + if (unlikely((if_getdrvflags(adapter->ifp) & IFF_DRV_RUNNING) == 0)) return;