From patchwork Tue May 10 08:25:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 110965 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 232D8A00BE; Tue, 10 May 2022 10:25:37 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BB20D406B4; Tue, 10 May 2022 10:25:36 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mails.dpdk.org (Postfix) with ESMTP id 7E10F4069D for ; Tue, 10 May 2022 10:25:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1652171134; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=no0xJ27Exw9w2w3PWKCoYAW96ZRqdiqSpVFoghh+s0Q=; b=XNhXBUf8wrNG9/fepn7IorB0a0/6/Tzz41sQ4AFtZkSJQkwRG1XUQDjazif2ZehgtH/5FC YGe6l9qqVHmqynmW+yFh9v8d16ms0ctdvbGHp3DBvuHTZ4Wef2SZxnzGWPdMxPLhYSmOAZ Xb0NxZseIn4k0uSzeikyjq2qZySz4G4= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-384-SpDyZeMhNWGVOZRKPVOjYw-1; Tue, 10 May 2022 04:25:31 -0400 X-MC-Unique: SpDyZeMhNWGVOZRKPVOjYw-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 679BF85A5BC; Tue, 10 May 2022 08:25:31 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.39.208.28]) by smtp.corp.redhat.com (Postfix) with ESMTP id EA000400E89E; Tue, 10 May 2022 08:25:29 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, chenbo.xia@intel.com, xuan.ding@intel.com, jiayu.hu@intel.com, cheng1.jiang@intel.com, sunil.pai.g@intel.com, david.marchand@redhat.com Cc: Maxime Coquelin Subject: [PATCH] vhost: add runtime locking check in unsafe APIs Date: Tue, 10 May 2022 10:25:28 +0200 Message-Id: <20220510082528.1229104-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=maxime.coquelin@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This patch adds runtime checks in unsafe Vhost async APIs, to ensure the access lock is taken. The detection won't work every time, as another thread could take the lock, but it would help to detect misuse of these unsafe API. Signed-off-by: Maxime Coquelin --- lib/vhost/vhost.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index df0bb9d043..39cbeb415c 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -1732,6 +1732,12 @@ rte_vhost_async_channel_register_thread_unsafe(int vid, uint16_t queue_id) if (unlikely(vq == NULL || !dev->async_copy)) return -1; + if (unlikely(!rte_spinlock_is_locked(&vq->access_lock))) { + VHOST_LOG_CONFIG(ERR, "(%s) %s() called without access lock taken.\n", + dev->ifname, __func__); + return -1; + } + return async_channel_register(vid, queue_id); } @@ -1796,6 +1802,12 @@ rte_vhost_async_channel_unregister_thread_unsafe(int vid, uint16_t queue_id) if (vq == NULL) return -1; + if (unlikely(!rte_spinlock_is_locked(&vq->access_lock))) { + VHOST_LOG_CONFIG(ERR, "(%s) %s() called without access lock taken.\n", + dev->ifname, __func__); + return -1; + } + if (!vq->async) return 0; @@ -1925,6 +1937,12 @@ rte_vhost_async_get_inflight_thread_unsafe(int vid, uint16_t queue_id) if (vq == NULL) return ret; + if (unlikely(!rte_spinlock_is_locked(&vq->access_lock))) { + VHOST_LOG_CONFIG(ERR, "(%s) %s() called without access lock taken.\n", + dev->ifname, __func__); + return -1; + } + if (!vq->async) return ret;