From nobody Wed Jun 17 06:18:36 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 2CA9325B2F4 for ; Thu, 23 Apr 2026 09:57:03 +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=1776938225; cv=none; b=smVGZVUDKHwarKv6q/Ze/E+zftofmgOWUxsOx3DdALtv7n8i5jGBY4Rym7ggTeVmramfsCXLHIYiE04IjggXekTuloKaRZmb67MfJC/S5Ne65VqNgxnBju3D2Gd5k3vvgOi05xiUXUF9ExBDAydzLTZ2WvX7r4O/HtWRqrLZ2OE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776938225; c=relaxed/simple; bh=0kKP6Dj9wE42gurqZT2AbsqWwAYD1wtRnreaMDLt0uA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=qBhbDa959RAFSoX8rH2Y2gvcGYr7LtpSdoWvrlP+XmYbgqJhizTcsqOp4PDfL4VFjbKQE4xlFXJYAinRbSRXMVbfGEok2cwLncYs3wagh6DQP+i0+zofFAXLe2Y2Mz6E6moMtVm5GuFi5Zbrez+fqMkff13V9FPiUtknbWgRujc= 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=YzWlWMto; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Uz288S9F; 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="YzWlWMto"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Uz288S9F" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63N8uBBm3294964 for ; Thu, 23 Apr 2026 09:57:03 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=2CXmq746DVzU+61iR+84gS zvzci3OloAb/uD7+epKWU=; b=YzWlWMtoOZRV2k7Yxhwv6r2uwvKM1535jTBC6J mhYb4cQQU4MPSnaGHaIV9g9aOMqz7mPoHHE5uKfgOgANWe/pmTAPaSfpeIm0UBBI TQN0FXbNBM0gcLvFMcAPEShfDMvpSF5fROCJdS5QjjWnvymKgEDJLOy05sxvpvsw KNNJyOuekH8Qvw45hqOSaZn2vcSzYnmENYoKwt9prhkLuTLyJ3ReUi0lU8VMUD1p QhonvsT6LahrLUD6MTdqIqgMchyEXVapU8Jed69sa2d8QG1Iv9pijXf9fiiY6SgS 7vul7aqAUeDPjYJ7oBPu2kihvUpjxe10yYYser+IhxaEBTLw== Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dq282u6mb-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 23 Apr 2026 09:57:03 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2b249541063so58607455ad.3 for ; Thu, 23 Apr 2026 02:57:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1776938222; x=1777543022; 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=2CXmq746DVzU+61iR+84gSzvzci3OloAb/uD7+epKWU=; b=Uz288S9F9Jb7hnxbXYEFbfsHbb7+uAVCna7qzqvYW9OkCZJ+qbUxLUyGQn7C0BbJjy 03XDFF0lH6mhM/+NyOkzGhj/l0/P+F6QaQDI+osCtA1bYUkRi7Zw1yr3ojCaO/YP9b/8 d95rJBZ1URuj2YRaI5wpg+I57WrFeKfNMYA70oRGDpM1KyPHCprZHjCAQyIL9ZnK076l s8gy7Yalp40I1jU+bgfID2EwMMGh4erZSycgg//Xe//JrCo++JWArZ3GXdlQsNMKVdYn amp945OtNN18o00TlEe7iCKjFmGn0soCIOutbljOAXYtXq/6158oTAl1XikuTQVmlJkZ PYbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776938222; x=1777543022; 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=2CXmq746DVzU+61iR+84gSzvzci3OloAb/uD7+epKWU=; b=isZescAab/YbrKYLiNydyHqeBgobJTxpjjXMTYSJd5SoPeyGqV0KHWeu5hFRYLdJjX YVCKmisBmbGLuM0piqD8rI34oML0Zm6UjpzcI84W+m0KocPlPnJzvNiMpDeazE26TOh0 nyE1rMKy9Hp7J1ZuiXstN+vsX/AXRYxhiZIa6eBIXr3a+FoHvFLJqK5Q9oI2ILnIQ1Ps zgIQqqf14HlgrE380Za7ixEEOMZ2is25O1/d5fYAN5pydUr2bWNnfuEmh5XGjPWf8DPK 9Jb076mBRlbNllVkUhKmHGXU/qOlfSidGoylXuOS/hX7vbwIhLRsXodKScoIjhss4ugx M14w== X-Forwarded-Encrypted: i=1; AFNElJ/9H0e5A3XcG+LeQjE/sZYWwUU7qvvJB2P4UYvLPHD4RkvArEgKusKT5GiaSXpVJUMniJw/2zuOAe1NtiM=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5QXdXKWaOfN+07xA3yOvPAA1JGRXZhRyO49HSV68w3erQvnra tSrey/TSErmN9LfBGOtK0CHuD3WWLAoiTK9NPJhlZ5vh0+C3ac2vfY7WPOKfvWVXkYOdcEurhS+ ka0mHyj2BlWaxrBv9nd1uxyGxN/IxBov39wM1Dn5kxzh3q+G+Vvo3sUM0vjT8NvcmgjXOxfpdNF Y= X-Gm-Gg: AeBDies//GFi0S6GNTXzWOPlF5jy3eaVJsd6a+RIpdfNEPsA22AhTtuh6rC67Qia/oh omCmZko+znAdXcDnYNCwYcaMFQl9XvyQ0ySUim4xTwUI3t/BSB2WSBmmeYoQDDceOGu3s8zMXNT NqtS8TpsE5c1W/9vRNSTMdqwgZ+v2OgfhliNfPPwH+jkT8JplsYG7T6K36VS6XszqAESm8nv/7l t74s+SY5wcqnGA5L2Gu3xNncRdYbXWqUf2PhnrWV2YyrDO2dTvU/NFSMmXn21PLquUkOwLHG4bR onoqppyxCAwxeJE9olvycLVhlQxzRp3ajEIUcpZhvDxWgzJ2/GRKzcz2SabE4n+MlVTc8g7Q96a 42C+IG8/QzuP+oqHqWFUXiqmd9ofpxJsp8qwwtrSKWbYE/ns8HMruhijjSV3HxuiJXFRlnqM= X-Received: by 2002:a17:902:cf12:b0:2b4:460e:6fa8 with SMTP id d9443c01a7336-2b5f9f61d45mr257079775ad.34.1776938222408; Thu, 23 Apr 2026 02:57:02 -0700 (PDT) X-Received: by 2002:a17:902:cf12:b0:2b4:460e:6fa8 with SMTP id d9443c01a7336-2b5f9f61d45mr257079525ad.34.1776938221878; Thu, 23 Apr 2026 02:57:01 -0700 (PDT) Received: from hu-pphansal-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b5fab0cbaasm193268955ad.54.2026.04.23.02.56.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 Apr 2026 02:57:01 -0700 (PDT) From: Pranav Mahesh Phansalkar Date: Thu, 23 Apr 2026 15:26:53 +0530 Subject: [PATCH v2] 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-v2-1-44c1aed1ce12@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIAOTs6WkC/y3MQQ7CIBCF4as0s5aGQaTWlfcwXdA6WhIplVGia bi7WN1M8k9evgWYoiOGQ7VApOTYhamE2lQwjHa6knDn0qCkMlLLVrAnL7ZKakKyqmkslOkc6eJ eK3PqSo+OHyG+VzXh9/sHUP6AhALFnlrd9zuNxppjYK7vT3sbgvd1OdDlnD86Zvz0nwAAAA== 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 , Pranav Mahesh Phansalkar X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1776938219; l=6596; i=pranav.phansalkar@oss.qualcomm.com; s=20260220; h=from:subject:message-id; bh=NKHzcJgCiz5zkqrXN2JkWisgaIBQciKsbf+IQXP6OVQ=; b=IWhlLlT0XHAp6+pnJqJprBDaVmOs5CFmKdqIiki+anPnDNTWiuWAVPR5GlVHCNGUhBugteUmd 5ngN/riLOOuAAgMyi6q2E00QLGPJrUPRAx9hzUxRGkEczBlxjZW5W2e X-Developer-Key: i=pranav.phansalkar@oss.qualcomm.com; a=ed25519; pk=MI1mUPTtmeY/WO9GsLnjtoVy4wYL57rtVnRammLT8B8= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDIzMDA5NyBTYWx0ZWRfX/ZuXTHC5xxim NzFHfPMecrYf76qusxOe4LQ1KGhXx+YyWobUFAbt2SGDxswwLPAOFlvOVcOOibyERxGGHMrXssO tBJ4tRo1MNJPBL3kWYVmtTUEWTK+tD23UjbblxhVd3xKU2LzMOYMguUJdYsh7GvcI5IKLCiKF0w UOUatevP8ZKireX0ZsdLrLSWW3SfL1Dn5EbW2vrSE+D1RXHWa2sACleCR2Cokr7jO8ZTRHNEMX/ mC13sGX9O8eBdzaD5xN2SKOaY3cUV95XQ36w0Wos5gVDmwftuFhdoLjetjfR7zp4cUpIk9P1qKC wByaB3pmLD6IJUOEopv/iUuh/FDa9koSFeZKPp+Mkr4IwzdUQ5Ang0AlNIQzmmlDpSr8uuzFrex /mKAHm6L9FeAk3Ox4y0Pq34WzYDwJBxij+a3xmNh8h2XwQI7qUQ7wuj3XgKTW1X+1Fb6FfYHU/B FofIMBo2CTzZsfnR8Bg== X-Authority-Analysis: v=2.4 cv=Zond7d7G c=1 sm=1 tr=0 ts=69e9ecef cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=P3-4SwOkx1ZPlWZU1AYA:9 a=QEXdDO2ut3YA:10 a=324X-CrmTo6CU4MGRt3R:22 X-Proofpoint-GUID: k3H2aTL_XBnVgv5t_w20V2-j3Yb9HB3M X-Proofpoint-ORIG-GUID: k3H2aTL_XBnVgv5t_w20V2-j3Yb9HB3M 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_02,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 malwarescore=0 suspectscore=0 clxscore=1015 impostorscore=0 spamscore=0 adultscore=0 lowpriorityscore=0 phishscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2604230097 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 Signed-off-by: Pranav Mahesh Phansalkar Reviewed-by: Konrad Dybcio Tested-by: Konrad Dybcio # Glymur CRD --- 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