From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 189142E6116 for ; Thu, 25 Jun 2026 13:44:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782395079; cv=none; b=kZbCHZ+vk6bsifroyFz+tcvZPwO3oZjjffahKDPCWRZ7SReadd7HzxV1RTEuZmEZadtFqADUIta7MwXzJCg5Q/Khb7P+XInuBGbgYlQixfqAuw0GZq3rutxVjHcr7BFMt4DrAeCOQ/mZb2nSDANa4S7sqINT+uNejH5MamNMels= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782395079; c=relaxed/simple; bh=DKP4p+F1gbMZPOryRL81pPG491H/HsqC3RvfauC/hJ4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=djfHGuuABsbzE4+H53h2/6FXcxJPqu9cNH4Pz/lVESLE+XbCAEORWvm9lpc3LeDHcAlaj3DncP0qhfCmprNDYCxVglPxhSkfVmt96WKkxWo3/fEYRDVre3Hf35Jg618dJ+j9deWvoScdNlSKv/8C2+D+31ICGW6baiPjueLcM44= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Gepoy817; arc=none smtp.client-ip=209.85.216.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Gepoy817" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-37df72f4705so539047a91.3 for ; Thu, 25 Jun 2026 06:44:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782395077; x=1782999877; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=b/3iI6+GQ7Nx6Y3HeWNjB9zYGFeER3TxI8ACBQoDMKU=; b=Gepoy817kEjEH+MOErlfTPzJvfImeiMxNp3WxqDeFFydyaGT5UigtRWuJwm5K8OCVf I/EvYZWuhjGJp74Uz4kgW1Cz47lO0uDGT8WqAOUwjLJsm4wUF4kHmXXlgcNJiZSBJNYQ PC8ANYtxgU5Hi75ENDiCWRzPXmhHkMjQKnMFzx+k6VC4f1vF6fUCkzJLUIwPWG30C5sz n4JFOTMvQXIb5xFZdrxFRll9r5S4plKa/GuojFihuw878SmINzpSW+27YadOk+2k7v1r Q17Q/PQmaG3hGkhtha1TWddO4ZczlK48ULLmYv4m6Fq2ad6cHQmpCIGnRhhwZu5uRLaH fYvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782395077; x=1782999877; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=b/3iI6+GQ7Nx6Y3HeWNjB9zYGFeER3TxI8ACBQoDMKU=; b=eY7KQfuH2pZTph7PZwRZ8UdsyxiklIea8R4wtARZP+hwJExW7KyrjG1dfYUO/OX0tW lH8FD9PZpDuxAaliaEHiLem+yEqS7zr/4IlMmA2olCnm84ySMAdop7SFSyFYntweWCt+ oRR9g93xSYuIAhZI+F8zcSdDW9h2d0Si5fPa2PmLTxqGOUZZ+k0ZtYzkESTSz+IyiVUs jXjSUdpc/TdhrJCRT/mAO560OpeBrJV86c31mCQFU3AEYh7orYJMVcnQ1UaAGPmFEHnU ao5qc2PqgcIzgNQOpYUmEw4GgIJC8sAdT3YDEqefEsgxBCkdlZINqZV1BCuFddFX//QA tXWg== X-Forwarded-Encrypted: i=1; AHgh+RpkNFLwVHpxxDOKeNJ8oP5+P5Ybwh3T9wrcOU3sfC8LetsGiwOii81tlgSP6XwTzY9gkY3UQM+Ica2K94s=@vger.kernel.org X-Gm-Message-State: AOJu0YxFvhcZG/GHzwCjjjUp5V+t6Z8F7yVG/S/p1FnwnJKF+ewDCHbg r1XdESYFHw09rZj1y7YJUyEJHq+D19hKpQzH0vO9MJS6dAJ/L/jhdPEOzqlpvwH8h+g= X-Gm-Gg: AfdE7cnDyqpM/ZsEvFy6oGgNKSZsNLg1Snv3Eju/Ego4L8N1ZfvCZUDMU94Bd/4h+fw zKM5Eb+UF3WOuRELJOJ1HoQQjAw6EZrABu04WFqVCSu4l/jE7vg9TOLnV7T2bDO4LOt8P81D71s dqGYDYDrGppmnldKLr7rZaDmssKtq5BgMXu7mRtuMaCO5zgzBZzywjTIQMVCRFV3mUxdqRpNgNS bLgwLX/bDz1kuS+5jPR4BfvGyokawR+DTM1ssDvrurL4q8Ck6Nfy6Cw686F5+GxfBMRNwrxRS/2 L1+F5zR68IC3hdW5HAm8yAQeGUmb/gpUW6ReLGxJ/Tj9z5nqmwMK3yCdnQ8V8BAdBp/WLchGaKE 00DRcvSiGsIzbqOn2pq9I5/lvxVXLghGBzLKtLPaDRCjly8dSa1+k3C0yvEfp6mNzgMygPWxYWo jv9q0hegx9mVmY8yCbUdJ0tVTzzXdyN54= X-Received: by 2002:a17:90b:28cc:b0:37e:a09:2432 with SMTP id 98e67ed59e1d1-37e0a0936b9mr240729a91.4.1782395077313; Thu, 25 Jun 2026 06:44:37 -0700 (PDT) Received: from haichao.tail057a43.ts.net ([2001:da8:e000:1206:839d:ff7d:8c1:eb6d]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-37df757696asm710486a91.2.2026.06.25.06.44.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2026 06:44:35 -0700 (PDT) From: Ruoyu Wang To: Bernard Metzler Cc: Jason Gunthorpe , Leon Romanovsky , linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org, Ruoyu Wang Subject: [PATCH v2] RDMA/siw: publish QP after initialization Date: Thu, 25 Jun 2026 21:44:26 +0800 Message-ID: <20260625134426.3084850-1-ruoyuw560@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260620155306.78919-1-ruoyuw560@gmail.com> References: <20260620155306.78919-1-ruoyuw560@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit siw_create_qp() currently calls siw_qp_add() before the queues, CQ pointers, state, completion, and device list entry are ready. A QPN lookup can therefore reach a QP that is still being constructed. Move the siw_qp_add() publication step to the end of siw_create_qp(), after the kernel-visible QP state is initialized. The QPN must still be known before copying the siw-specific create response to userspace, so reserve the QPN first with an empty XArray entry. This lets siw_create_qp() report the QPN while QPN lookups still return NULL until the QP is published. Fixes: f29dd55b0236 ("rdma/siw: queue pair methods") Suggested-by: Bernard Metzler Signed-off-by: Ruoyu Wang --- Changes in v2: - Move the siw_qp_add() publication step to the end of siw_create_qp(). - Add siw_qp_reserve_qpn() so the udata response can still report qp_num before the QP becomes visible to QPN lookups. drivers/infiniband/sw/siw/siw.h | 1 + drivers/infiniband/sw/siw/siw_qp.c | 26 ++++++++++++++++++-------- drivers/infiniband/sw/siw/siw_verbs.c | 14 ++++++++++++-- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/drivers/infiniband/sw/siw/siw.h b/drivers/infiniband/sw/siw/siw.h index f5fd71717b80..f8d28dd7dd86 100644 --- a/drivers/infiniband/sw/siw/siw.h +++ b/drivers/infiniband/sw/siw/siw.h @@ -510,6 +510,7 @@ void siw_send_terminate(struct siw_qp *qp); void siw_qp_get_ref(struct ib_qp *qp); void siw_qp_put_ref(struct ib_qp *qp); +int siw_qp_reserve_qpn(struct siw_device *sdev, struct siw_qp *qp); int siw_qp_add(struct siw_device *sdev, struct siw_qp *qp); void siw_free_qp(struct kref *ref); diff --git a/drivers/infiniband/sw/siw/siw_qp.c b/drivers/infiniband/sw/siw/siw_qp.c index bb780e3904a2..7d6224ebfe71 100644 --- a/drivers/infiniband/sw/siw/siw_qp.c +++ b/drivers/infiniband/sw/siw/siw_qp.c @@ -1279,17 +1279,27 @@ void siw_rq_flush(struct siw_qp *qp) } } +int siw_qp_reserve_qpn(struct siw_device *sdev, struct siw_qp *qp) +{ + qp->sdev = sdev; + + return xa_alloc(&sdev->qp_xa, &qp->base_qp.qp_num, NULL, + xa_limit_32b, GFP_KERNEL); +} + int siw_qp_add(struct siw_device *sdev, struct siw_qp *qp) { - int rv = xa_alloc(&sdev->qp_xa, &qp->base_qp.qp_num, qp, xa_limit_32b, - GFP_KERNEL); + void *old; - if (!rv) { - kref_init(&qp->ref); - qp->sdev = sdev; - siw_dbg_qp(qp, "new QP\n"); - } - return rv; + kref_init(&qp->ref); + + old = xa_store(&sdev->qp_xa, qp_id(qp), qp, GFP_KERNEL); + if (xa_is_err(old)) + return xa_err(old); + + siw_dbg_qp(qp, "new QP\n"); + + return 0; } void siw_free_qp(struct kref *ref) diff --git a/drivers/infiniband/sw/siw/siw_verbs.c b/drivers/infiniband/sw/siw/siw_verbs.c index 1e1d262a4ae2..ef9fa9c5bf88 100644 --- a/drivers/infiniband/sw/siw/siw_verbs.c +++ b/drivers/infiniband/sw/siw/siw_verbs.c @@ -369,7 +369,7 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs, spin_lock_init(&qp->rq_lock); spin_lock_init(&qp->orq_lock); - rv = siw_qp_add(sdev, qp); + rv = siw_qp_reserve_qpn(sdev, qp); if (rv) goto err_atomic; @@ -482,14 +482,24 @@ int siw_create_qp(struct ib_qp *ibqp, struct ib_qp_init_attr *attrs, goto err_out_xa; } INIT_LIST_HEAD(&qp->devq); + init_completion(&qp->qp_free); + spin_lock_irqsave(&sdev->lock, flags); list_add_tail(&qp->devq, &sdev->qp_list); spin_unlock_irqrestore(&sdev->lock, flags); - init_completion(&qp->qp_free); + rv = siw_qp_add(sdev, qp); + if (rv) + goto err_out_list; return 0; +err_out_list: + spin_lock_irqsave(&sdev->lock, flags); + list_del(&qp->devq); + spin_unlock_irqrestore(&sdev->lock, flags); + + siw_put_tx_cpu(qp->tx_cpu); err_out_xa: xa_erase(&sdev->qp_xa, qp_id(qp)); if (uctx) {