From nobody Sat Jun 20 20:54:49 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 AA732883F for ; Fri, 10 Apr 2026 05:32:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775799164; cv=none; b=nlu1aVOUzj2bEB+WZ4Kq/8fPE4fl/qs3QtoB4Fmc0y8PnJGyqxQobZTize1T5SSI8IFQkW4SRWfeBAkzolqnWDuVJvGbBAtlHp4zW1BkAGSQRO4L5a8dGnxWty6Oq96iGnEArYsUI0AMwYIChrlP7EMZYCjuaMYohHEPSyVz+uM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775799164; c=relaxed/simple; bh=nNDOyStEfKwxSRhlDiRLd1YPO4z/rxdnqy/71WIiF04=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=fQEVyhKHjAQjcREralKsY1flIjaXvrf5r5NwyJ954KIcRiK2bfG2i6l6MXgvUyIIaSnZ1gLMQEcFInpLI20wuu4EcEzRfEhHkThN3vfCJ07kXOVIusGeWvihNk4qCuon6z9c7UFkdMHOoDSWHKdnV/55Mjlz6ot9m+uUHxQBcK0= 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=nqhkCkfR; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=CNqc2JDN; arc=none smtp.client-ip=205.220.180.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="nqhkCkfR"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="CNqc2JDN" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63A4qhLA2698249 for ; Fri, 10 Apr 2026 05:32:41 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=HKtW7Uog/PnIe/VJ3VexUk pT0i2hZ5ozH2fSE7ogaNM=; b=nqhkCkfREP6dAK8Pj9xr/CFRmba/Du2+4gSy1K v+L6qeigH8t5XmU5NvdZsfbXFdexSFPC2wZkFb0ZeHciipaFkbwPAeNtn15csZsx Joki4OhAGsBVp1IDyeH7Pvn7E74pv+7f2JRl3Io25aos+S2zlBN9OE+LPfW9fsuj l+DS1j5HIRqKOORPF8zz7Dg0vB8QZMtvAt9uYBohh8gukB3/VCHRIMtAzB4E7A0T fzROJ8fcNc6WqSgcIhnXAzob90njD1KTYsrtGLSk8v0uGLO7PqyWnubtEap2Ldba OsVvgu9wNzQmnBDxGtkv4YMPXIpeeOisLUk51B3fCAZfEmsg== Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4degt9sra3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 10 Apr 2026 05:32:40 +0000 (GMT) Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2b0cf396c45so20836735ad.1 for ; Thu, 09 Apr 2026 22:32:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1775799160; x=1776403960; 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=HKtW7Uog/PnIe/VJ3VexUkpT0i2hZ5ozH2fSE7ogaNM=; b=CNqc2JDNJttfFu4h+kXTA4pt5sIYcwjyvyke2krTUzQsaqHQpRGafvwOB/tFNS8CJK TKcWiFNb1XtOpluLgM7VphUdONw+fBE78cxQrcXZRgo0j5uGqlKu9HPo26SR7whe6SjO v/DFcuhi2z8Bs9BIWs6QCNCHsjtNUQBFYO0CIRjKLB7wNVO/P/lOhrOSpdq5rT5C6UBP HSqijUPbaoHnQYwjrEjKTMqIEVqdofM3CMHTobXBnDuZGpSaDrKFPyRTT4qZhbVt+T8K xhB0aJguYTm2qnNh+kZpDkoe9sttd6cbZqu/pVUdAKIiWl5eKq6LzGw3qkqm2qiRMwMx mmcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775799160; x=1776403960; 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=HKtW7Uog/PnIe/VJ3VexUkpT0i2hZ5ozH2fSE7ogaNM=; b=tXWZprFaGFx5ZuIvkzrfSvf5I4rAw1ENKO1ez7TZtIZuCBE+2luCESzJHq89JHaC4Z 1qjYm+keNvQQKbe2ZbYBdTnvpaA5cvE1FScJmNJc6meRErKcXGv8BzuyWphBqKScnyeH AyqlK81hQ5sKw2z7QcT0OdNKLWYmrCHG6S1h9yhc5jBTWppT4lG4dc7lWLU4AxPtfQVp Lyjc5sABQYBy8Z4dXFbrJLl3fnHPRxLGU0snoT/bia1SFwEzrXL49V1FT0fwrmDEXkIw O5g5GE3eHI6Ogi3EgLveG79dFEgBx3p3VkBUiG7rDlw+mF5KlHAO2iH7TG2Cumup0osK yzwA== X-Forwarded-Encrypted: i=1; AJvYcCXHlqgf+ymOQoJhjes3FhhngWeWqXsR0thEswR+7NIoQJeKDOoItNagK9CinyV7oYxWrIfjx7xU/nFWbdM=@vger.kernel.org X-Gm-Message-State: AOJu0YwvPmRZsd0YSbwEa0mrlEOyOfFgtlyX5YUiX0V4WQG+YQOaNRbh wMSdqijcRpffjYqT72iwdKIizLH9/o8+KLXHvvX5nbthQgOsJbeumHu3bCz6ZKA+f35W22/wVa8 i0XhS/uVOlzS1XxsXckWxyC0AfkmnqKe07pew52f2+l3Q/kyUfzLMtyHvOa63N2SHpe4= X-Gm-Gg: AeBDieuKMXSwl9UTv4yBBPK1h7jweRS1Xr4WecA6Pb1oSuJyjp2ygKwNNbvK0TfAeKB DERNfs/On2st8Dcr5KzHdBUoSUDvVXX58/lqZnvOxV4qr+cyXyGtVPDKUJUdyxr7er62crgg2Mr 2knn2NjYGQomjaP55J6FzsR5aI9PTGwlT1K72owU5CPdEbt0DR+NXiltJU1VzP5bS+pcUfp4VbP ZmBgzheccalmtSOJciIw/XuzbAUbIxUs4/n5r88BGyS6VN7YxI4vIT9gcvE9izKplVDG7oqMx7n kiWkPq3ihDpEv1gGmWKN2nCqXetVdP6oaySoioz7KFLBt5ZPWWJR/NT1QNggJjgBhCCbVhG8awI /sD5DCLJ1K9THd06N1l/w91zR/TO5o626JZvIpvmByI66juNea0utn0/mto1J X-Received: by 2002:a17:903:252:b0:2b2:4697:78f6 with SMTP id d9443c01a7336-2b2d5a8b81cmr19715845ad.37.1775799159639; Thu, 09 Apr 2026 22:32:39 -0700 (PDT) X-Received: by 2002:a17:903:252:b0:2b2:4697:78f6 with SMTP id d9443c01a7336-2b2d5a8b81cmr19715365ad.37.1775799159104; Thu, 09 Apr 2026 22:32:39 -0700 (PDT) Received: from hu-pphansal-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b2d4dd5cfasm18013255ad.18.2026.04.09.22.32.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Apr 2026 22:32:38 -0700 (PDT) From: Pranav Mahesh Phansalkar Date: Fri, 10 Apr 2026 11:02:30 +0530 Subject: [PATCH] drivers: 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: <20260410-smem-v1-1-8e94bb5416a6@oss.qualcomm.com> X-B4-Tracking: v=1; b=H4sIAG2L2GkC/6tWKk4tykwtVrJSqFYqSi3LLM7MzwNyDHUUlJIzE vPSU3UzU4B8JSMDIzMDEwNL3eLc1FxdYyMDk1TD1EQjc/NEJaDSgqLUtMwKsDHRsbW1AMHo3WN WAAAA X-Change-ID: 20260409-smem-3204e1ea277a To: Bjorn Andersson , Konrad Dybcio Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, bjorn.andersson@oss.qualcomm.com, chris.lew@oss.qualcomm.com, Tony Truong , Pranav Mahesh Phansalkar X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775799156; l=6441; i=pranav.phansalkar@oss.qualcomm.com; s=20260220; h=from:subject:message-id; bh=0B0dSlijat1LaOx6iMYvEwg6JvXrUuooSoR1F5r1IP4=; b=H59GWDPQuaU/y69Xe0xZEa8w84HYdDdEBVlA4ZOQoRcbXkWryGBZoGKY8+BJztnfE+f0qjEAu WXlWVqIYnpUArA2HVedGK2q+pV+byr3Lehaoj11KrDgMH29mFKCG11A X-Developer-Key: i=pranav.phansalkar@oss.qualcomm.com; a=ed25519; pk=MI1mUPTtmeY/WO9GsLnjtoVy4wYL57rtVnRammLT8B8= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDEwMDA0OSBTYWx0ZWRfX1AUfGYzwyyJ9 eOLR1u9xKC+7i72RLD41qbLmIFKx0l/0BUj0+5/y6u7/sT1ZqoJFsb61O0RAdEfvkEZGNIe4/zJ VSkhPTZ1WAJMcTPjykEWl7cYyHJyvNUe2NHrEektAI/fnWfc0+TmWavoFpTrG5ANSZepi7ASuED whxeWhpjzsR1GIP0nVGNHC0tFo+5Em9EFYMjnIsQPZe1PouhhRFEFtAWSiWx4A7os4F3kcp2Gya qzPSbmdYComgEgWw/aX2eATm0gXBBde8xNFCyD7+kgv48KHz+K+9DZrbGehojWvBq6sHxAEUp/E 6uQEDmF0dNT78KuZXVYt2yvXwFxu7Oi486fsh56ZRYWDYbWGk5x2xLwXc70kCPeEJS3Qg1SRl6Y KaVf9SvsUqd/ZsNv4/PRuqG4YnCepEdb+VOrcj/OBLdgKX4NOYC2U2+kgqJHjPh+wlf06QGg+Wi 7R3NGaTYUCa1U7PedBg== X-Proofpoint-ORIG-GUID: WOGPLn53Xseifr04BQiP6zKTuwJpCA4C X-Proofpoint-GUID: WOGPLn53Xseifr04BQiP6zKTuwJpCA4C X-Authority-Analysis: v=2.4 cv=BJyDalQG c=1 sm=1 tr=0 ts=69d88b78 cx=c_pps a=MTSHoo12Qbhz2p7MsH1ifg==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=P3-4SwOkx1ZPlWZU1AYA:9 a=QEXdDO2ut3YA:10 a=GvdueXVYPmCkWapjIL-Q:22 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-10_01,2026-04-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 bulkscore=0 adultscore=0 priorityscore=1501 impostorscore=0 clxscore=1011 phishscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604010000 definitions=main-2604100049 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 Tested-by: Shawn Guo # On Nord --- 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