From patchwork Wed May 11 06:58:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 111017 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 CB44FA0032; Wed, 11 May 2022 08:58:47 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 700EE410F2; Wed, 11 May 2022 08:58:47 +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 D085B40042 for ; Wed, 11 May 2022 08:58:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1652252325; 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=WkezL5KR+Kta2eXnr4+6fhcTTBlLqbwL3oUY6jk5ssg=; b=SPnQB0jptJVAOEVrCivXtSdP/mjy49nYdvMzROPAZcI08e2qg13Z4aa7ril5Ml8ce6a04O 9q9KwvXLPmLm0os2BoowZKzVABPGF0jacz1CWG1dEhrVLrLTo7qL3KoHubmTeis+aovPLR BWOHQRP7EQyk33rygsc3Xp6yrc3iAjE= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-384-y7Vrd_GcP2-bgvZJwx7LyQ-1; Wed, 11 May 2022 02:58:42 -0400 X-MC-Unique: y7Vrd_GcP2-bgvZJwx7LyQ-1 Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.rdu2.redhat.com [10.11.54.10]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 7BB321C07823; Wed, 11 May 2022 06:58:41 +0000 (UTC) Received: from max-t490s.redhat.com (unknown [10.39.208.28]) by smtp.corp.redhat.com (Postfix) with ESMTP id EDE00416369; Wed, 11 May 2022 06:58:39 +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 v2] vhost: add runtime locking check in unsafe APIs Date: Wed, 11 May 2022 08:58:37 +0200 Message-Id: <20220511065837.1267895-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.10 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 Reviewed-by: David Marchand Reviewed-by: Jiayu Hu Reviewed-by: Chenbo Xia --- lib/vhost/vhost.c | 18 ++++++++++++++++++ lib/vhost/virtio_net.c | 6 ++++++ 2 files changed, 24 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; diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c index 5f432b0d77..59163bc165 100644 --- a/lib/vhost/virtio_net.c +++ b/lib/vhost/virtio_net.c @@ -2091,6 +2091,12 @@ rte_vhost_clear_queue_thread_unsafe(int vid, uint16_t queue_id, vq = dev->virtqueue[queue_id]; + if (unlikely(!rte_spinlock_is_locked(&vq->access_lock))) { + VHOST_LOG_DATA(ERR, "(%s) %s() called without access lock taken.\n", + dev->ifname, __func__); + return -1; + } + if (unlikely(!vq->async)) { VHOST_LOG_DATA(ERR, "(%s) %s: async not registered for queue id %d.\n", dev->ifname, __func__, queue_id);