From nobody Wed Jun 17 06:18:06 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5BEEC39E191 for ; Thu, 23 Apr 2026 10:55:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776941755; cv=none; b=USgGfBSLAUd1Hlo3hFErdlV8M9TIeADhWleZyIAzVJVP4uUhDYIU7QQjXcreisWeHEYyaoQSdtG8MA127h/JIp0HKvS2yCKy4zrsVSSZMK+FBRP8f4lF+93s0F7LD+H5qdjLpToIAAE/ZIr9qIZAGih/sUr0OdS3JBV4anHMOPw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776941755; c=relaxed/simple; bh=oquimsdylq6e4dxvjPMxgAyu95+lTDYGZoRipPdYDCk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=G5Q0+YmtIBENWyUD43OPBADZQSKC4sYaYsX3t01JsJPHEEyj0tXB2jaJEHi9BhjOOGFZ0u0asxofau3bzI15ML7Ur7lANnmV/paWENDt3sXW/7250RgsEs4eWF791I85dc4xxQqSXQcau7zQI/TNTJfDA/pOm0tYTuInE0cuvDg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=cfDrT6Qc; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Emp0Cuk9; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="cfDrT6Qc"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Emp0Cuk9" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63N94wpZ2319682 for ; Thu, 23 Apr 2026 10:55:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=qcppdkim1; bh=MOVoovIndLii3OYcFvQGn2 M/kt6pfSxGXHviuf+KjIA=; b=cfDrT6Qc3v7fLWn2w1vWjV7xIX5Q312B6LjIri au0TjdQiNnEvseJ9Oo+zfE8O1f9APEv8rJjZ4a/YjJsKlBpneorqrPTTSuqrMTtP meaCV6AA3nUl/rBYb3q4Q7JN5hQKpkQNcmtApwFsuIpli40PUuqTGGBLeFYrHVfZ uyZN/unhaGn+Z+VeRb8rBUW+YhfPf/NW+5fc+byzxm7mDPop2FqQ9besjKUcdBa1 Oh1MUBp2/HgTuNVd+QOgjJm3Jtobbn1MGmloNfqOK2VHcMCU61aGCsxYJ0lGhLJ1 fVlq9vttUUzTcF4x/MF9benaFu1R8AQnnv3pKuRlaUqgpWdA== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dqgfsrdjv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 23 Apr 2026 10:55:53 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-b630753cc38so8308985a12.1 for ; Thu, 23 Apr 2026 03:55:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1776941752; x=1777546552; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=MOVoovIndLii3OYcFvQGn2M/kt6pfSxGXHviuf+KjIA=; b=Emp0Cuk9hkhll8EAOJkT9aXBRdQ+L1IuyVPwSCwVD5cPBGMDK2ApeEKoXAjI2YlFgB Njwl0/8g7nluoy/zhgsJAxTRCXieiIJD3nsOYR3DZxZM2X7N3mUB7r4mjpg8lB+lJSWp iMAz7p9KSgrA60IXPSMiig5Bd9fE82CBzlzfFURs3/uDTFEHp/9eCLMvQApa2YBCaNN5 sDHLDDA93NOlF7glyUfqbVpaqHDaCq6nRsHgtL8bcjsD8Bg3Z+c9HLOp04tfb+h9IUnO 9pb0DDpLMKKHFfwMf+n2yUsY92kQ/U2sGfQIJUwOQxsKDghnWOnUPYghsnVskK+ye0KH JLDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776941752; x=1777546552; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=MOVoovIndLii3OYcFvQGn2M/kt6pfSxGXHviuf+KjIA=; b=dPkuAXynsQcOuh+UpmNIBbgTfIT2LvT/ihBzSUtC+Yr8tgiAvPBDbc3D0iprjoqV26 jig01deHJmJiT4jol9bVHp2+I1qFNB2dOlCtjjvIQPPUCwtjs3UJWLnARIFHWMuHMxt5 sF1nZVvND3MDxxkNZp5qyA2VReIqfGGTij2ueKdrh4M47oc/gtVP18dSWhwhelDIgvbo WFTc5C6X5d1Zq3KmCSgPyKMF+5gKSYIhbjKb8IrirQLROKMht/8TKZ/Ul1HwG428lNRw kdqFZ4ga50z7hmxgXZIwNkZ539c5Tiuk0nUL20CMC0y4/YJiTpr86innNT6Com2SMyXn HQLw== X-Forwarded-Encrypted: i=1; AFNElJ+wAVo23orNq2B64JALgCy9QxUlHTdVS3k3/dJGtsXz4IvBmnyaFHATXeYiRC0ppX8GP+V0SEkCDzVURp0=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/ZYxBXwXM01J9aW4CTcE9LrtjNfwXvZnjNpM8/n9JvAHTjgqd QMm/2aiqN3LHNEB+3Me8N4AuNwGdHPURyUIzXex/ftlKsd73L9C0jgAvF4NKmx46zUAdp6LTDkj SgGhfC+P9Xw+a8K36ooXUFWYzuVFrBIac4io8nmBQd8nYfM02GvrLSYN1a7KFFBrVGDQ= X-Gm-Gg: AeBDieu34A5szNyr0neKBZ+04Ochb2Me+WqRc0UIFf8wsEx/qfP0S6z4eUTfG7GWsaZ nXZSPBzIkDmREHNNMPFqrVOm+9pnGoZdrAkGZYWhs1FR+cOsU+O9TRDgLurK0z2FS7639nf5IL6 lKAmA2KXleWQVIHjrEivRL3AAz1QnjV0/Ttpf4RSOeOrIQZ5cQWovxoOR1LshdQel5vUPos1X9p U/LAIlM6d3eV4G9OrQfwRqarPjn8oNK00MkFgEUhjonR4nOOhKZYpvGSD44YD23dF1RdtGGhPNd bOYtfJIuNxlKAofhC9/6MUY/EVWSbeQMmbD1r7gljHLy5EiagNpccto4udaG0BKC3DHYJqecYv9 uv3/aghTO5/YAcuKzl0OsaPsAkOLbMwmMavCQb7ZhMsc++DUJpOcyeNqGMsOEMZ8vKS0AkAs= X-Received: by 2002:a05:6a20:4324:b0:39b:e321:784f with SMTP id adf61e73a8af0-3a08d8d7bbbmr30436164637.40.1776941752487; Thu, 23 Apr 2026 03:55:52 -0700 (PDT) X-Received: by 2002:a05:6a20:4324:b0:39b:e321:784f with SMTP id adf61e73a8af0-3a08d8d7bbbmr30436130637.40.1776941751957; Thu, 23 Apr 2026 03:55:51 -0700 (PDT) Received: from hu-pphansal-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c797703059fsm15140508a12.24.2026.04.23.03.55.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 03:55:51 -0700 (PDT) From: Pranav Mahesh Phansalkar Date: Thu, 23 Apr 2026 16:25:41 +0530 Subject: [PATCH v3] soc: qcom: smem: Switch partitions to xarray Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260423-smem-v3-1-582befff289a@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIAKz66WkC/22MQQ7CIBBFr9KwloaZYmtdeQ/jgtLRkkhRUKJpu Lu0duHCzSRv8t+bWCBvKLB9MTFP0QTjxgzVpmB6UOOFuOkzMxRYCylaHixZXqGQBKSwaRTL05u ns3ktmeMp82DCw/n3Uo0wf9cAiG8gAge+o1Z23VZCreqDC6G8P9VVO2vLfNjcifjjYrW6mF0pN SjqQRPgHzel9AHCThcj2wAAAA== X-Change-ID: 20260409-smem-3204e1ea277a To: Bjorn Andersson , Konrad Dybcio Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, shengchao.guo@oss.qualcomm.com, Tony Truong , Konrad Dybcio , Pranav Mahesh Phansalkar X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776941748; l=6953; i=pranav.phansalkar@oss.qualcomm.com; s=20260220; h=from:subject:message-id; bh=/lw9Z+iq7Chpy2itRAkxhrp+LFd/nYyBNtNCexJgLBU=; b=E8vsbaY0mRA7pxWA9OrQaBV+TvHuMxRhgF7Cjgb8VNUclvAKR8NFZza3RkhxBXNAklqzif86s IdQh+Jc4klqDCh8S9drORTlnWPCaEuwDGuFjvC/begNq92IzSmnV2DL X-Developer-Key: i=pranav.phansalkar@oss.qualcomm.com; a=ed25519; pk=MI1mUPTtmeY/WO9GsLnjtoVy4wYL57rtVnRammLT8B8= X-Proofpoint-ORIG-GUID: SuAHVRIyhJo4r3hexcFU5j0SWTZL8YnN X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDIzMDEwNiBTYWx0ZWRfX+D75WnOXMBFF v1DwVaKJBPKBFp8LFbw0s8sxC4w3d40fFgAYIj7f5dNrfZ7sPtw1KqY3867UNWOZyZFHZ+LTX/x orjBP9B+KEgG/dQgtQxOuRmyQfHNlt7QeGFOExjML/cxpJzNanOHZ6ralPbliTxK5RqYp8C4lvV gBklNeHMw1N74x7OYpeVkgydCZkFbGwGPUrE/CamsXcyFDwMFYjPbjZstr7CGoToM619UjK9ksY gA/zwAKLXn+0LOYXIuXRKpyRcE96wpCrxdkzqge3msy52ihyprWCmTYI/LQQl3jlio+kuqLXLy3 U8K1z7vAEefbcm0gyONprEw0IUcgDVLhqkGRZyjHkYaKsPUhLRsweNezkyAsqdkiPefQ6ii5wiR DEjZDWWQ8aMd5iy0cYe6NZq65+c84axgLGLd2R7dCoqUnTHG+a80mjjRHxrpmkIEed6MVZn69uw KLyYlV/rvHYj2F8pvfA== X-Authority-Analysis: v=2.4 cv=AvbeGu9P c=1 sm=1 tr=0 ts=69e9fab9 cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=P3-4SwOkx1ZPlWZU1AYA:9 a=QEXdDO2ut3YA:10 a=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-GUID: SuAHVRIyhJo4r3hexcFU5j0SWTZL8YnN X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-04-23_03,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 impostorscore=0 phishscore=0 suspectscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 malwarescore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2604230106 From: Tony Truong The partitions array is currently statically sized and uses the remote host ID as an index. Future protocol improvements to allow for more than two hosts in a partition will require hostIDs to be bitwise significant integers. This will result in large, sparse host IDs that generally exceed the current static limit. Switch to using xarray to efficiently handle these sparse indices and allow for dynamic growth. Signed-off-by: Tony Truong Tested-by: Shawn Guo # On Nord Tested-by: Konrad Dybcio # Glymur CRD Reviewed-by: Konrad Dybcio Signed-off-by: Pranav Mahesh Phansalkar --- Changes in v3: - Include missing Reviewed-by and Tested-by tags. - Link to v2: https://lore.kernel.org/r/20260423-smem-v2-1-44c1aed1ce12@oss= .qualcomm.com Changes in v2: - Drop "drivers:" from the subject prefix. - Link to v1: https://lore.kernel.org/r/20260410-smem-v1-1-8e94bb5416a6@oss= .qualcomm.com --- drivers/soc/qcom/smem.c | 56 ++++++++++++++++++++++++++-------------------= ---- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/drivers/soc/qcom/smem.c b/drivers/soc/qcom/smem.c index d5c94b47f431..afb21a778fe7 100644 --- a/drivers/soc/qcom/smem.c +++ b/drivers/soc/qcom/smem.c @@ -85,9 +85,6 @@ /* Processor/host identifier for the global partition */ #define SMEM_GLOBAL_HOST 0xfffe =20 -/* Max number of processors/hosts in a system */ -#define SMEM_HOST_COUNT 25 - /** * struct smem_proc_comm - proc_comm communication struct (legacy) * @command: current command to be executed @@ -282,7 +279,7 @@ struct qcom_smem { struct platform_device *socinfo; struct smem_ptable *ptable; struct smem_partition global_partition; - struct smem_partition partitions[SMEM_HOST_COUNT]; + struct xarray partitions; =20 unsigned num_regions; struct smem_region regions[] __counted_by(num_regions); @@ -382,7 +379,7 @@ static struct qcom_smem *__smem =3D INIT_ERR_PTR(-EPROB= E_DEFER); int qcom_smem_bust_hwspin_lock_by_host(unsigned int host) { /* This function is for remote procs, so ignore SMEM_HOST_APPS */ - if (host =3D=3D SMEM_HOST_APPS || host >=3D SMEM_HOST_COUNT) + if (host =3D=3D SMEM_HOST_APPS || !xa_load(&__smem->partitions, host)) return -EINVAL; =20 return hwspin_lock_bust(__smem->hwlock, SMEM_HOST_ID_TO_HWSPINLOCK_ID(hos= t)); @@ -530,8 +527,8 @@ int qcom_smem_alloc(unsigned host, unsigned item, size_= t size) if (ret) return ret; =20 - if (host < SMEM_HOST_COUNT && __smem->partitions[host].virt_base) { - part =3D &__smem->partitions[host]; + part =3D xa_load(&__smem->partitions, host); + if (part) { ret =3D qcom_smem_alloc_private(__smem, part, item, size); } else if (__smem->global_partition.virt_base) { part =3D &__smem->global_partition; @@ -697,8 +694,8 @@ void *qcom_smem_get(unsigned host, unsigned item, size_= t *size) if (item >=3D __smem->item_count) return ERR_PTR(-EINVAL); =20 - if (host < SMEM_HOST_COUNT && __smem->partitions[host].virt_base) { - part =3D &__smem->partitions[host]; + part =3D xa_load(&__smem->partitions, host); + if (part) { ptr =3D qcom_smem_get_private(__smem, part, item, size); } else if (__smem->global_partition.virt_base) { part =3D &__smem->global_partition; @@ -730,8 +727,8 @@ int qcom_smem_get_free_space(unsigned host) if (IS_ERR(__smem)) return PTR_ERR(__smem); =20 - if (host < SMEM_HOST_COUNT && __smem->partitions[host].virt_base) { - part =3D &__smem->partitions[host]; + part =3D xa_load(&__smem->partitions, host); + if (part) { phdr =3D part->virt_base; ret =3D le32_to_cpu(phdr->offset_free_cached) - le32_to_cpu(phdr->offset_free_uncached); @@ -774,12 +771,11 @@ phys_addr_t qcom_smem_virt_to_phys(void *p) { struct smem_partition *part; struct smem_region *area; + unsigned long index; u64 offset; u32 i; =20 - for (i =3D 0; i < SMEM_HOST_COUNT; i++) { - part =3D &__smem->partitions[i]; - + xa_for_each(&__smem->partitions, index, part) { if (addr_in_range(part->virt_base, part->size, p)) { offset =3D p - part->virt_base; =20 @@ -1016,16 +1012,20 @@ static int qcom_smem_enumerate_partitions(struct qcom_smem *smem, u16 local_host) { struct smem_partition_header *header; + struct smem_partition *part; struct smem_ptable_entry *entry; struct smem_ptable *ptable; u16 remote_host; u16 host0, host1; + int ret; int i; =20 ptable =3D qcom_smem_get_ptable(smem); if (IS_ERR(ptable)) return PTR_ERR(ptable); =20 + xa_init(&smem->partitions); + for (i =3D 0; i < le32_to_cpu(ptable->num_entries); i++) { entry =3D &ptable->entry[i]; if (!le32_to_cpu(entry->offset)) @@ -1042,12 +1042,7 @@ qcom_smem_enumerate_partitions(struct qcom_smem *sme= m, u16 local_host) else continue; =20 - if (remote_host >=3D SMEM_HOST_COUNT) { - dev_err(smem->dev, "bad host %u\n", remote_host); - return -EINVAL; - } - - if (smem->partitions[remote_host].virt_base) { + if (xa_load(&smem->partitions, remote_host)) { dev_err(smem->dev, "duplicate host %u\n", remote_host); return -EINVAL; } @@ -1056,11 +1051,20 @@ qcom_smem_enumerate_partitions(struct qcom_smem *sm= em, u16 local_host) if (!header) return -EINVAL; =20 - smem->partitions[remote_host].virt_base =3D (void __iomem *)header; - smem->partitions[remote_host].phys_base =3D smem->regions[0].aux_base + - le32_to_cpu(entry->offset); - smem->partitions[remote_host].size =3D le32_to_cpu(entry->size); - smem->partitions[remote_host].cacheline =3D le32_to_cpu(entry->cacheline= ); + part =3D devm_kzalloc(smem->dev, sizeof(struct smem_partition), GFP_KERN= EL); + if (!part) + return -ENOMEM; + + part->virt_base =3D (void __iomem *)header; + part->phys_base =3D smem->regions[0].aux_base + le32_to_cpu(entry->offse= t); + part->size =3D le32_to_cpu(entry->size); + part->cacheline =3D le32_to_cpu(entry->cacheline); + + ret =3D xa_insert(&smem->partitions, remote_host, part, GFP_KERNEL); + if (ret) { + dev_err(smem->dev, "fail to insert host %u\n", remote_host); + return ret; + } } =20 return 0; @@ -1229,7 +1233,6 @@ static int qcom_smem_probe(struct platform_device *pd= ev) return -EINVAL; } =20 - BUILD_BUG_ON(SMEM_HOST_APPS >=3D SMEM_HOST_COUNT); ret =3D qcom_smem_enumerate_partitions(smem, SMEM_HOST_APPS); if (ret < 0 && ret !=3D -ENOENT) return ret; @@ -1249,6 +1252,7 @@ static void qcom_smem_remove(struct platform_device *= pdev) { platform_device_unregister(__smem->socinfo); =20 + xa_destroy(&__smem->partitions); /* Set to -EPROBE_DEFER to signal unprobed state */ __smem =3D ERR_PTR(-EPROBE_DEFER); } --- base-commit: 7f87a5ea75f011d2c9bc8ac0167e5e2d1adb1594 change-id: 20260409-smem-3204e1ea277a Best regards, --=20 Pranav Mahesh Phansalkar