From patchwork Sat Mar 16 14:34:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcel Apfelbaum X-Patchwork-Id: 1057368 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="kc4QosEV"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44M4nJ026Tz9s00 for ; Sun, 17 Mar 2019 01:38:27 +1100 (AEDT) Received: from localhost ([127.0.0.1]:42588 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h5AS9-0003K7-UE for incoming@patchwork.ozlabs.org; Sat, 16 Mar 2019 10:38:25 -0400 Received: from eggs.gnu.org ([209.51.188.92]:49557) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h5AOS-0000oF-MF for qemu-devel@nongnu.org; Sat, 16 Mar 2019 10:34:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h5AOR-0000Y1-6C for qemu-devel@nongnu.org; Sat, 16 Mar 2019 10:34:36 -0400 Received: from mail-wr1-x444.google.com ([2a00:1450:4864:20::444]:41068) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h5AOQ-0000Xa-PX for qemu-devel@nongnu.org; Sat, 16 Mar 2019 10:34:35 -0400 Received: by mail-wr1-x444.google.com with SMTP id p1so12433403wrs.8 for ; Sat, 16 Mar 2019 07:34:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TojS5oiQeA7UbBVQIzqnuGXBXWwpcJDFdf1d+U42fNI=; b=kc4QosEVEw4yYpaIpNOvvZZUVRV5ppV1cBF+q4mUyyZr3Zkj+Fcg4Kfrry+nzDSN44 usFvjRbeP/BvGORJRdnsFlnaLR6KhI8S2EEWBhj7TKm/sX4l6LLUSIIa6ZfSq5K+5tsh Qt4+QkYnfn3q3++BdlQzigZ8w+KbFd3AEycsyqSQ+w9iqws+cAvbH/xPYzJr+IsRzcos YMs0DZ+Z3ymn0OvOJo5ii9eui6QpLZDnUi9w3C2Yrk9aCajMzrMFyzlQnlaWtoRqyQpP MqK7D1B126nDuw0uvmaCnRSxFmlYUMD4nuks8mNODhXKkOvv/Z8ZzBC9s4M+pvDx/p+R vVLg== 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=TojS5oiQeA7UbBVQIzqnuGXBXWwpcJDFdf1d+U42fNI=; b=Lugfd2op3BODtLCMSvhVCvAI7v9AVkMMHLcS6HESe97ZCMX2/fqgWgoASHu4XnD8KF Cbjo5OWznRgwJqYNgka31luD6smIpVMjqzEROPkELhH/8tXTD6ifO7wvwenPnglifhsG l8yAu/cX3nSSkXAZavI8jWmTSMPcRnxsLOUjEBfY9Auf4hkOd10x3OWp5oX6j3msAFvQ rTFucT26AfdO14A2D4TI4PMRv2QOZfK7XSSAL0ldRFwnPytU03spZJLJ4uIQ1WIPAORL k5sAZxJIsEF4WgP0dkLoI7CmCnduqzMIxHRFDbvuYQeFT6w5aoDAsx6qY/13y/WYa/US L2OA== X-Gm-Message-State: APjAAAVmGjBS55BMVUui+2BG0gN08swgm79oE3IehjsG7N2VW1dmpjow XczKJfmXWMLsaj9y5jh+zg1l3iew X-Google-Smtp-Source: APXvYqxyCVoODtglOyDwXEvhEJcSjb15m6F3BcJnuMJiqA9pishlimtG7QpCrwv8LzFB5F0yMJBa4Q== X-Received: by 2002:adf:f3c5:: with SMTP id g5mr5915282wrp.247.1552746873482; Sat, 16 Mar 2019 07:34:33 -0700 (PDT) Received: from localhost.localdomain ([176.228.155.165]) by smtp.gmail.com with ESMTPSA id l8sm7518895wrv.45.2019.03.16.07.34.31 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 16 Mar 2019 07:34:32 -0700 (PDT) From: Marcel Apfelbaum To: qemu-devel@nongnu.org, peter.maydell@linaro.org Date: Sat, 16 Mar 2019 16:34:07 +0200 Message-Id: <20190316143421.8194-5-marcel.apfelbaum@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190316143421.8194-1-marcel.apfelbaum@gmail.com> References: <20190316143421.8194-1-marcel.apfelbaum@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::444 Subject: [Qemu-devel] [PATCH PULL 04/18] hw/rdma: Protect against concurrent execution of poll_cq X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: philmd@redhat.com, kamalheib1@gmail.com, yuval.shaia@oracle.com, dgilbert@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Yuval Shaia The function rdma_poll_cq is called from two contexts - completion handler thread which sense new completion on backend channel and explicitly as result of guest issuing poll_cq command. Add lock to protect against concurrent executions. Signed-off-by: Yuval Shaia Reviewed-by: Marcel Apfelbaum Message-Id: <1552300155-25216-4-git-send-email-yuval.shaia@oracle.com> Reviewed-by: Kamal Heib Signed-off-by: Marcel Apfelbaum --- hw/rdma/rdma_backend.c | 2 ++ hw/rdma/rdma_rm.c | 4 ++++ hw/rdma/rdma_rm_defs.h | 1 + 3 files changed, 7 insertions(+) diff --git a/hw/rdma/rdma_backend.c b/hw/rdma/rdma_backend.c index 37edf42215..18975401d9 100644 --- a/hw/rdma/rdma_backend.c +++ b/hw/rdma/rdma_backend.c @@ -70,6 +70,7 @@ static void rdma_poll_cq(RdmaDeviceResources *rdma_dev_res, struct ibv_cq *ibcq) BackendCtx *bctx; struct ibv_wc wc[2]; + qemu_mutex_lock(&rdma_dev_res->lock); do { ne = ibv_poll_cq(ibcq, ARRAY_SIZE(wc), wc); @@ -89,6 +90,7 @@ static void rdma_poll_cq(RdmaDeviceResources *rdma_dev_res, struct ibv_cq *ibcq) g_free(bctx); } } while (ne > 0); + qemu_mutex_unlock(&rdma_dev_res->lock); if (ne < 0) { rdma_error_report("ibv_poll_cq fail, rc=%d, errno=%d", ne, errno); diff --git a/hw/rdma/rdma_rm.c b/hw/rdma/rdma_rm.c index 66177b42f5..7ea62a9e60 100644 --- a/hw/rdma/rdma_rm.c +++ b/hw/rdma/rdma_rm.c @@ -617,12 +617,16 @@ int rdma_rm_init(RdmaDeviceResources *dev_res, struct ibv_device_attr *dev_attr) init_ports(dev_res); + qemu_mutex_init(&dev_res->lock); + return 0; } void rdma_rm_fini(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev, const char *ifname) { + qemu_mutex_destroy(&dev_res->lock); + fini_ports(dev_res, backend_dev, ifname); res_tbl_free(&dev_res->uc_tbl); diff --git a/hw/rdma/rdma_rm_defs.h b/hw/rdma/rdma_rm_defs.h index 0ba61d1838..f0ee1f3072 100644 --- a/hw/rdma/rdma_rm_defs.h +++ b/hw/rdma/rdma_rm_defs.h @@ -105,6 +105,7 @@ typedef struct RdmaDeviceResources { RdmaRmResTbl cq_tbl; RdmaRmResTbl cqe_ctx_tbl; GHashTable *qp_hash; /* Keeps mapping between real and emulated */ + QemuMutex lock; } RdmaDeviceResources; #endif