From nobody Fri Jun 12 14:00:00 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 132F931691A for ; Thu, 14 May 2026 15:51:07 +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=1778773874; cv=none; b=dgazz6JCOdTdNVWLiVlAE5avjB/b6rcoBUEWRW5bnoAonimAKtYIat7mQE2Xcs1esovwx+eUVR2MpI3cU8ZH9solUw5F0QCi3TuEg7XbsdkJ5hTiApG4yxCABf/TeJu8TeeuYkLC/ywvVyqkUWj6Tp2Kh8nENRva1gwseia+sCo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778773874; c=relaxed/simple; bh=57vychfueC0MTVqTPCvkcg0ziquH1M8ssyJCiqhqLBY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hZHGcH/JuQMvTS3/DDvHw0XwJxgopVevldyZuMDFOXr7y1LWVWqk+gmDL4GJOOm58BWp1nbyurvR5VwY0btQjKsX8W9DI9cVKifUsYqbLNUUohOd8+tssUZxgwsMDFCPjCB6NJMXSkUhi63HS0XsFvQpjAyFUvvMI3+4gvTTbt0= 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=IAna9ek6; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=VJhTNyJv; 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="IAna9ek6"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="VJhTNyJv" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeSDE2261515 for ; Thu, 14 May 2026 15:51:02 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=I9Hssygm+uY xt39VNWVm2uPyzkD0gBQJ33IPewYgkKA=; b=IAna9ek64nCVwcKDgDKo8hL1dwb NtlY69Qln9Cccnr8z53KZIMqnOMBgke/rJN+erelGNkVyJZDlRSYsvgYWqcqryqo RFVYmNbyomviz+f44SCmE77jk4cy3dEu2pD+IQ7WsD+pOm+ByYkmD773edwd7DgI mrkRBhpsbIVQs22PBaFQNN+7VufnIAZHHawrVjuEOatgSbtK3ImT7bCKzQ6XhCeh HC5Tz96KVcJCAUGgl4vzhb6Fc4sbFNMUSIue3G0uEFZBWHIlyIV66b5hbcgAiQUl amjtALPTML0z4s7DpMoMXfaLwHDDUJhWCFBISghDxj7UR+h/dP1h7qrlplg== Received: from mail-vs1-f72.google.com (mail-vs1-f72.google.com [209.85.217.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e563hjjp1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 15:51:02 +0000 (GMT) Received: by mail-vs1-f72.google.com with SMTP id ada2fe7eead31-631289505b8so4073532137.0 for ; Thu, 14 May 2026 08:51:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778773862; x=1779378662; 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=I9Hssygm+uYxt39VNWVm2uPyzkD0gBQJ33IPewYgkKA=; b=VJhTNyJvCSobpyVLNFHOtXOVZoPoNAQl/O8C/6pVwRnJLrLka804kD5oQUjxjEklpd 3d/l8rqdPJxKBG+M5iDaueyDW6Ys5GsCR1QflImhUbA2B8pzxOwtowpTfLZIHcCA+X4q m3W3PMHvmFV81sFJv0y4zZtuYMJFYjD7w4G6JB+48Wn9sRJAXIarLGPkScJsozaOrB74 lsFVyfbCHIry05MN6fCtIGH0XTeyodsvSeyH6CmsU1AVmmpjMXvp9jPXY+3SP8RLq89H dPmmodEFOoP9G0UQEDnJZ1C1hHDBFOvhyAfIECkBkZo67gvonLi5EAzyNBthR/83lC6z zr0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778773862; x=1779378662; 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=I9Hssygm+uYxt39VNWVm2uPyzkD0gBQJ33IPewYgkKA=; b=c1eGQflrO7JgPWf6AMSIhR/opmgPXDWHS6ZKpNhQQTernGtbJql0FjFf1rq2Q822vv ZVHrGRDXbSnrAahgMFCbu3LV/yghcskLoxjJaliyEjvZ0swn7yOGhWVKTyxZ7bw0fkZB YssiSxuSceHe1YevFtV3GyQBnEgcTW60cO8YRi+nzziZvyPUP+feOj57P+6HROtUdsB3 jvavRoX+gpqmg+eiAd4DbyVt44u4r9K9tAhSnsXOAmtZKff+V3im27IO3R4YvzPlWHLS gTa8eNb9zGNfWb0E8cUovduEKVRWBqURdMjnnxDIwPEkkYUpidfVXlNY8d1/jzPHoRan BSiA== X-Forwarded-Encrypted: i=1; AFNElJ8ahS7DPap9B9t3Yk6Kce0z0UPwBIMytU0SYeWC2ec5LI0gdyBIsRURrsld/HR6BbdTTMrpdsuMM06NBMw=@vger.kernel.org X-Gm-Message-State: AOJu0YwHu3uTKJcZiSu8Nz/MXs0w6V4cHrADuL+kjp1DvYWhvR9tnvxO tjp+8kIYqlwh7zonBLBcLUYEJ/t/oyfAn4IGvsy7gg4tGy2hg7qcCm59Hi/qPEzrDNYNJGFyGFz yXKiNZ1Wt4ULltO3x2ejz999/ei2FLxDjCCxB8/NksRn+cwWyYI61EqrW/2pDJu/seXk= X-Gm-Gg: Acq92OH8MI2rrz077W4h8gy3YRve/XpbU+VcgirSrKXoqwpWBV4k72NgwVQkR+ZiNLn +kvyCDJFOD38tANNvjFv9wF5OuHxtPuiitH3MmfEJA7Ap/q9aS9ZeNcU+TrtYsQ2+arMY3dc72Y Erx9RTWzjpzG76kmEiUkWqy2D2LDM0w83ME1MXl8idNkJF2vAB8MQLM/7DCh6ETW8ie61nVRYpR si6ppvzWn0eVXEryjxh++boUr3Ua0Nl5xCdOljQ0MiOm7EUqo51EN3pwneQboxCf9HTLgVTs4jU NaIsMpOO3GB2hHfMMKYI7um/2zi1hP8eGMGcIA1F2uFcykigWzh1hK2JfSZzQ4t2uGJi5wv5yV+ DGJ25t3WE8Tg7y5JGJ55k0kPlZ5/nMA2pU6yZDc9KgPj19RMHSDMuEnOG3bsJ3BjFuA== X-Received: by 2002:a05:6102:c4e:b0:631:d3e4:efcb with SMTP id ada2fe7eead31-637740331e4mr4426037137.23.1778773861783; Thu, 14 May 2026 08:51:01 -0700 (PDT) X-Received: by 2002:a05:6102:c4e:b0:631:d3e4:efcb with SMTP id ada2fe7eead31-637740331e4mr4425802137.23.1778773858665; Thu, 14 May 2026 08:50:58 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45da15a666fsm6967067f8f.36.2026.05.14.08.50.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 08:50:58 -0700 (PDT) From: Srinivas Kandagatla To: andersson@kernel.org Cc: srini@kernel.org, konradybcio@kernel.org, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH 1/3] soc: qcom: apr: Remove service from IDR before registration failure Date: Thu, 14 May 2026 15:50:49 +0000 Message-ID: <20260514155051.2593354-2-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260514155051.2593354-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260514155051.2593354-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: WYl6bV1QD_XUXhy0dUjijBC5pfiTlepv X-Proofpoint-ORIG-GUID: WYl6bV1QD_XUXhy0dUjijBC5pfiTlepv X-Authority-Analysis: v=2.4 cv=DewnbPtW c=1 sm=1 tr=0 ts=6a05ef66 cx=c_pps a=DUEm7b3gzWu7BqY5nP7+9g==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=EUspDBNiAAAA:8 a=fuhSPDijbYtawkcQ4mQA:9 a=-aSRE8QhW-JAV6biHavz:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE2MCBTYWx0ZWRfX4EMtZ7gFNswT 0Esk9k/UvfmtynTTYaj5oEwYELk1Zl7GkdSeXWz33d+Qdu752Vri9GWwtL6GzlPp75BAY9if3az yjTsA+rJMR0XLv5aWa2koGMJ75pNLLuQrhV3bsIpwDl9NxLIC8+lN1JDvkNE1nUpOgHzrJkoqd+ 9KelKoL83KOhO/uCUIcNA5NgehAyihq0QsDx2gWXQhOJtWpTMEf8urbT8h/Q9BhBZw6bdYXOu88 YG7q+ojYSt1HoQ71GTRvuDc2Jo1BtNrZPlyJ5FlrhNZ/mFfoJUynjAX1QYgaravdgNdvdAl1Tq0 qLiDDqj/PFVOpWJEh5f7JD6P2wMxuoClNLY4c+KPl962zyD7aU8kOaNtsRLgFnP7wEf6SYTAiLI R/d2XyKL1TR3oTZ8YGvQu1wlIxVD3va6AtRbHw/1NwrE79DQpoCCwAFICYr4PNmsqb4njZ8pNaS zX64YLOVpbYn9G9J4Jw== 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-05-14_04,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 phishscore=0 spamscore=0 malwarescore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140160 Content-Type: text/plain; charset="utf-8" apr_add_device() may fail before device register, do cleanup of idr from global apr->svcs_idr list so that we are not leaving any stale id in the list. Signed-off-by: Srinivas Kandagatla --- drivers/soc/qcom/apr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c index ea7f83916d8d..127204c195ea 100644 --- a/drivers/soc/qcom/apr.c +++ b/drivers/soc/qcom/apr.c @@ -466,6 +466,7 @@ static int apr_add_device(struct device *dev, struct de= vice_node *np, 1, &adev->service_path); if (ret < 0 && ret !=3D -EINVAL) { dev_err(dev, "Failed to read second value of qcom,protection-domain\n"); + idr_remove(&apr->svcs_idr, svc_id); goto out; } =20 --=20 2.47.3 From nobody Fri Jun 12 14:00:00 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 4BE8330CDAE for ; Thu, 14 May 2026 15:51:05 +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=1778773870; cv=none; b=Z213iP9qWkIKeSpo1ZWxphpI0WoxT8bfW75kUC/KXhxKcI2FArZ8wK87N4tVvP0+nMM1xVX7fmoMG7hqrhvXUEPEmASTcgXJbDxUTu0rqbNFzx6Gj5B/sdLTTED6G/uPSzvqe7lbWnJHUUDYCrsQLKPuS5PBn0nCXCm9zYdq1Kk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778773870; c=relaxed/simple; bh=8MEl+BgGkiaZBwbz6FvWwT8L3rP9aORLehU5yrQrfCY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rv89UeNnZ0C/aHMbS2j1rDsIjqMsOgg4Se70XDpf1ci5aqm9qhukbCBoapHxcVqka4LCKSXLGEkmRLr5idqSwI51B4DZALfOiL0O7MGPfRKQXXYW9tBTPMUlIE0Mbrlzn6j9tMDKp9QriSVAKd4FX3iLksSfVDUgqktJzR70Wko= 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=GQKXIe/I; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=kdrm9DTt; 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="GQKXIe/I"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="kdrm9DTt" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeUsl2241709 for ; Thu, 14 May 2026 15:51:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=kp+b1sDmdyU 7/z1soTFzi5u3lYlucYrQChAjmvIDfQI=; b=GQKXIe/I3Za95Z0qTsXBMembtZj nw5pKpCq/KGNVkfCuNOKA/17oElGpTuKE5WJr9xZ5Lun4OIUwgRpfxr8pySLAbv0 S/9bLTHWh5X9uXTuLJ5zJI/MGep2WlgQ5Pk83NOHmkDV8aGf4WxMwS9oUdutCSK8 lwBhCzD4fe7n5vV4iEmljHBDJwegv5nHmTHe4YE0YCnB3e7tcoeT70Zd7SKFOL/q 9tv+A/WKwU9G47qYjYXC55fJFFJbIMNC4ElLCQwS0EezSDX+DPXd7jd7ROo9Z6lj JWXPAhnsxEO/f9QKpjoiwo9GwrcWOuiNITytDWBd1J6euPQBlF7MzEXDNEQ== Received: from mail-ua1-f69.google.com (mail-ua1-f69.google.com [209.85.222.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e513gbdf8-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 15:51:03 +0000 (GMT) Received: by mail-ua1-f69.google.com with SMTP id a1e0cc1a2514c-956732444ffso13574317241.1 for ; Thu, 14 May 2026 08:51:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778773863; x=1779378663; 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=kp+b1sDmdyU7/z1soTFzi5u3lYlucYrQChAjmvIDfQI=; b=kdrm9DTt+MT00P5htNXy1L/aV0QgkAYgUQIz3DCQXO+abv83iEn1lSjq7eX0qEXvnj KtOuzKV8dWe9zyBCnkdjtTHn3LR/2Mib0VxqXkvnuPp24lLMyCVKDuKWyq4hZU8RI+Rk MqH7gf3vHsVXv0HseqzkNd22w7QMM8sQ8Jnwr7k+iFBvmQN3nbHEzH1n+qeXp0V84j29 4fMVXxZd/S6ucvf+2YgyYeXXZ2ta7fbAq03CQhj/m04dUev3147WhoUkY7bUk+q9viue Qprbt8E5yzEkyByeHTnuXRfgjadZ34WCFjJPTgb+zDuTKxxz44Ojd8riocdNVtpjI3TC ErhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778773863; x=1779378663; 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=kp+b1sDmdyU7/z1soTFzi5u3lYlucYrQChAjmvIDfQI=; b=D7wg4Zgyhc8CzYoU+Qw8arVE/N/OVlLX8Wxh/8dykNkUqbh1/t1kiT0OQ2Fb5t94pd iFbRAGtQYY2TX9HOWnAVqTByJGquIPxmVLRn6lfaSZnNvKXwkl1p9fwQfX2k45TNCAhF zrQ47s6uz5lugimhjSSbsgs/x+tgSfKZkaqG+N3GeUtBzcIAqsffjmCE8NvRHHOF/q+V /Mej3RawDY9tNKRglxby1F3jV/NudHoVmFtDAfeBx09yv1+ugQu54fOwflsI0rTd2lqR QKw81DFFkym4a3SLaQ4iceq2ehX6hGFVaQl+hb/bUu/2nFCDwbxx9QELENs01wnteJDN WafA== X-Forwarded-Encrypted: i=1; AFNElJ85HmqxMVbjAUogouLvKTyOcce6foxuvh0B+IEcGnYeJF3gJKhpq3O9oVa+jljJHZExIyGtqk4yqd8TgXE=@vger.kernel.org X-Gm-Message-State: AOJu0YyKvy7q2evKNivYjs2CPA+GgoVGPccl4xMmQNa8OZPanIYGV/S5 Ay+2hZ6JxjYH6xUHCg4sVIu9bBP5HYnZ7Fot2n4t1HUPr6Ac3+dw3KAe15ss/tBS+N8KjRkcS06 UISqavycgxTnfp9nN94zM65xOF7RnLotCBhuNoxO7kr7/RDxSb4gWw8e+UTj5eiA1IAw= X-Gm-Gg: Acq92OHjsVtBQVXrnXJatQjeyUrzf38z+hnJ99/QTaNRv1TlXzSp6zUXI0Lx/hjHSm7 38uppigqjvS5uag/tYEw27zZ2XPNFup1ytBxxQBKt1eB44uLsRX6GYmqcCW1Zkq2pp05PZM9rcO AHK1vsG5tvGCaA7N5EWM/+6q4LrhlBwBvimmYgpSJI2PJAEwhmndtPavgTmDxzjxPFOInnT5HDF N2GbbRn5mspajR6uJSGTOym/jKq9pIMaTER2pSKsBT5FcOjMDTXEWl0X1CMH12AEUp0Q59nltFn NlJ7KWFA/gpDWZduOXd9Y5d+Q/ViV4YvX4EPFPyH0NzVPLec8rbEQq6rQWB2LV2YBsYGY0SsHJ0 GWsKlSzMxU91GkOi/uzmAlO6+6EGC+uylHUeB3vZKOF3dlibqol0/1TI= X-Received: by 2002:a05:6102:32cb:b0:631:44d9:2ca2 with SMTP id ada2fe7eead31-63776780cb8mr5037604137.30.1778773862976; Thu, 14 May 2026 08:51:02 -0700 (PDT) X-Received: by 2002:a05:6102:32cb:b0:631:44d9:2ca2 with SMTP id ada2fe7eead31-63776780cb8mr5037585137.30.1778773862563; Thu, 14 May 2026 08:51:02 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45da15a666fsm6967067f8f.36.2026.05.14.08.51.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 08:51:01 -0700 (PDT) From: Srinivas Kandagatla To: andersson@kernel.org Cc: srini@kernel.org, konradybcio@kernel.org, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH 2/3] soc: qcom: apr: Check response packet length by router type Date: Thu, 14 May 2026 15:50:50 +0000 Message-ID: <20260514155051.2593354-3-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260514155051.2593354-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260514155051.2593354-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE2MCBTYWx0ZWRfX2IcZZP2qMI7z SbUk8biP1rXQwY/VSvHqy+A2GSVZ6/jPPBCXGAl0X06k1SVspLx4qHRyXIV9mJnOGxAySO7AZpU 4qoMVAQ/UogYBVEZWSS9P8R+jMP/2nhI9ECGc4GkMnma9LQJZ0UJQl7jMe26RmoZhorFT7dWrcr TFBVU/bPUZwfdsBmUID7ZCDJDMsfQ+DvTzyjXNvv7jBMDzc36nPmY8Q+26phEn7EgoemHehNRSw NyAqocIiRyC8esWfLyG9evQEkGqvPBFLm8vqGyqmYewxh2g9D4rL+tcWRsSYmotDhm5Knr7B5S0 8ZfdfkC3MM7g7hsjHKc2iUNGnloE4G4GVdoo7xotC8InaSWHH5eEA8Piy3aEk3upvuFLM5SciMU tzoQMJRvLXGqzIypFtBd0JCpES1RCKV6/zVXvr2Tq24P5tG43gy4OXoZgXPU39Ua7/Sz78JfbFu YcUWlWV9tvAzKg59H2w== X-Proofpoint-ORIG-GUID: 1dtSEFfwNTomJ0MAS8hTbXtP71KvPn7S X-Authority-Analysis: v=2.4 cv=Iba3n2qa c=1 sm=1 tr=0 ts=6a05ef67 cx=c_pps a=UbhLPJ621ZpgOD2l3yZY1w==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=DocHB_6yuvdUiAEOOo8A:9 a=TOPH6uDL9cOC6tEoww4z:22 X-Proofpoint-GUID: 1dtSEFfwNTomJ0MAS8hTbXtP71KvPn7S 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-05-14_04,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 impostorscore=0 bulkscore=0 clxscore=1015 spamscore=0 adultscore=0 malwarescore=0 suspectscore=0 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140160 Content-Type: text/plain; charset="utf-8" apr_callback() currently validates all received packets against APR_HDR_SIZE before queueing them for the RX worker. This is not correct for GPR packets, which use a different header size. Validate the received packet length against the header size matching the packet router type before copying the packet. Signed-off-by: Srinivas Kandagatla --- drivers/soc/qcom/apr.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c index 127204c195ea..68b357462438 100644 --- a/drivers/soc/qcom/apr.c +++ b/drivers/soc/qcom/apr.c @@ -165,9 +165,20 @@ static int apr_callback(struct rpmsg_device *rpdev, vo= id *buf, struct apr_rx_buf *abuf; unsigned long flags; =20 - if (len <=3D APR_HDR_SIZE) { - dev_err(apr->dev, "APR: Improper apr pkt received:%p %d\n", - buf, len); + switch (apr->type) { + case PR_TYPE_APR: + if (len <=3D APR_HDR_SIZE) { + dev_err(apr->dev, "APR: Improper apr pkt received:%p %d\n", buf, len); + return -EINVAL; + } + break; + case PR_TYPE_GPR: + if (len <=3D GPR_HDR_SIZE) { + dev_err(apr->dev, "APR: Improper gpr pkt received:%p %d\n", buf, len); + return -EINVAL; + } + break; + default: return -EINVAL; } =20 --=20 2.47.3 From nobody Fri Jun 12 14:00:00 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 07C63317144 for ; Thu, 14 May 2026 15:51:10 +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=1778773876; cv=none; b=qPHuG+go2Z3y791APlaAIIWmj90WisEuCS3kkmFrtNuJfLs2XcaRKAwVqfjx2OYR3RICGFgJRnsTj7saEC6Pp8LT5Tfxyzx2pk0p7K/Td0PEamsWQdN34ce0PbwIHkfHnxvzCShxmdmbtAVYvgU7qoRMgtmw/L8vS44/rYr4Adk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778773876; c=relaxed/simple; bh=sw65wg/gLObwIYJeE44DoHEjbavZZQqBt5qYGDc9Jx0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OVGy64Sr3IKTqceRcFKOwXXb6EtdVZgXn9/naGlypgsRY5uxXAG/wwXkkK2Mbjp+KAm6SBLeFohZpJcRP29y87T/eI80gS+sPJBBn3slEItUq7Cx1QJT/3l3v1vFySpUhElrJSNm6kvcR1WfXWpUJiZJKegvljZcgIldsr3/PY8= 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=XSrGnd1c; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=QqmzK+dZ; 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="XSrGnd1c"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="QqmzK+dZ" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64EBeQ4Q3951598 for ; Thu, 14 May 2026 15:51:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=LLMRt9m1xYG D32un0pFlcXHxQno0LK7UKUpMQvEbLio=; b=XSrGnd1cg37Dy8h6AmTPM4EGd7g 9YdEPvKat6xdhYCQVJYGfSTsYiiaX1gjPUqdZfcC9KexRqjgSr45OodTaEjjxfd/ LXyF2Q3yXW2tIpqJEuLvxMBr6Ht4vuvlom3XW4Vu9fa81EzTEPCSK08mWYCXeWGp BI7u3p0p1E6sSjJaStnI/T66zD84Y1aYgd9M8OXXCaI45DT4EHY9KIHRGgvJdt0A 0NFa1WjqWwMa1D3f3d8ZnU8fopd82zbc/Ygcz4wmSyBflQSAUrzyM1K93Mfh1Vbt iHGWmkO4wLhvfniZrTLlLscGXxpJhUitLA8k1S/0Oe1lk2OKLrgYMbNYfwg== Received: from mail-ua1-f72.google.com (mail-ua1-f72.google.com [209.85.222.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e57kst9kh-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 14 May 2026 15:51:05 +0000 (GMT) Received: by mail-ua1-f72.google.com with SMTP id a1e0cc1a2514c-95d41dc2ea7so3896960241.0 for ; Thu, 14 May 2026 08:51:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778773864; x=1779378664; 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=LLMRt9m1xYGD32un0pFlcXHxQno0LK7UKUpMQvEbLio=; b=QqmzK+dZ+1BjJgIPmubFD9LKjpHwImu52C2WqiZoS+68PXK203PdCl17IO4KuAYMtR ILC5EG2V0uCDP0hwts1aSSN+AN1HjVtxPjJ5BynESduWzqPkNGoRRel3ycPxKGBxjUwd xSXtVdRgsapOgal0rcV10T3E7UQAoiAVLciFUaDnmNQdVgrVayldYMnWf3SqqjXrUKDF a/UeBk0BUfbn6L2y9ogBKPqafUpzrk+Hj2ylXgVq9n2Xq0qUOcdXNWzWttN2Mc4/cCsh MM8iK13c4t8l9mNH3j9j6dVgd7iVnpYZCw04H/gunr+f1QDkwJBPW9HyBngZvuMuH72w 1NPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778773864; x=1779378664; 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=LLMRt9m1xYGD32un0pFlcXHxQno0LK7UKUpMQvEbLio=; b=e+TMllsfGregPURoZXHxQ/3hZjaFEE1KrPha96g/xhKzjCH/uGg9V9n+QnPw04SciH 8raM0hhWIYJligRRuNw9u2s0HPtBfndoAuewYrkcWWfsKb+3U0DyST2m/h8Nf4bmZmY2 vFSnbED4edTCn/iTNUxmc+ni68OYnh//HEC5+x3lkoSdXRbkm6IxKCEboTUvp8XMafnw vstCPvuW4tIos8stngEV2rb33fq0mwZ6VFg1tkZDC0233jY4LoBzBP0gJHSjz/p/IdtR YQYU2FxiGUittNVbdVuuTGa46I1D2ojr/rnPnsymSvjoSZ6QSkflEIeFuxYr/hPQ1ra9 aK/w== X-Forwarded-Encrypted: i=1; AFNElJ8rZ4l+pR39I/tMwvxm5lU+ISL5Dfmc9Z03tyh07hoK46jtiDE+3WgUO9JRPVQ6rKsF0suHuw9sxHEEgm4=@vger.kernel.org X-Gm-Message-State: AOJu0YxTIz6ilaoJMPRPTSFcaN7Y41mXoi86LiBnm3GhiggP9W9hAxKF lctWA2bF+yiXJ0qZjV3obUctfTppEfl/R0sKna1EOEpFcIxMCdyrys+PE30a0sADnTGUHPKCxv1 IObFYvq1UL1RP0DCWoYo9K05B7gWhJDnmbhWkirGqhbO6X3lGwukOAcbQbhEx2pj/xcE= X-Gm-Gg: Acq92OF22LPw2Cy3tMeIqB/i2PALPADOSm216ijCaUZ1wYboBKGf8UzfA0vhZZF9z7c VKJ/1zTJpWrmCPZOFqzZLzmkQP70TX/1qLz1o2i+EjBRpe34IK6BzjhIqSUv8ZLxjq4F7zKzNqm QEw7ycpXL0Dxei7lWoUR5LSRBnHBPQIeYfiT7e9HHO7OGC7ooszhOBVRg6TgQNk7fHPoolky+SK 319Yq/DtcmzMVw6a1GP2lJ5IjZeb4Z+zkCi5sl0QqrHpaBIAjMLCKflCUCb5nfZTJBRh48dfsKq +BG6Xm70QPQxJeTdWIfU4D3297tvgm/KO6Gz+/TrEreAuGQc7GL7+bJcdpPaq2fYHVywaATPX5C tbGjCG85qZkwNL/rMlVYYhsNNl2IUQ0OfUv+thj1u22Uv77tzkZyYQHM= X-Received: by 2002:a05:6102:605c:b0:604:f849:462e with SMTP id ada2fe7eead31-63774129752mr3880614137.25.1778773864434; Thu, 14 May 2026 08:51:04 -0700 (PDT) X-Received: by 2002:a05:6102:605c:b0:604:f849:462e with SMTP id ada2fe7eead31-63774129752mr3880558137.25.1778773863721; Thu, 14 May 2026 08:51:03 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45da15a666fsm6967067f8f.36.2026.05.14.08.51.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 May 2026 08:51:03 -0700 (PDT) From: Srinivas Kandagatla To: andersson@kernel.org Cc: srini@kernel.org, konradybcio@kernel.org, linux-sound@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Srinivas Kandagatla Subject: [PATCH 3/3] soc: qcom: apr: Process RX messages using per-service work items Date: Thu, 14 May 2026 15:50:51 +0000 Message-ID: <20260514155051.2593354-4-srinivas.kandagatla@oss.qualcomm.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260514155051.2593354-1-srinivas.kandagatla@oss.qualcomm.com> References: <20260514155051.2593354-1-srinivas.kandagatla@oss.qualcomm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: aELmddGPVAaMvlKveXS256GpF5U1nMrg X-Authority-Analysis: v=2.4 cv=KZbidwYD c=1 sm=1 tr=0 ts=6a05ef69 cx=c_pps a=ULNsgckmlI/WJG3HAyAuOQ==:117 a=ZsC4DHZuhs/kKio7QBcDoQ==:17 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=Myf5NQMlE0kz4Lw5rJwA:9 a=1WsBpfsz9X-RYQiigVTh:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTE0MDE2MCBTYWx0ZWRfX4WiWYG5Ym6VR 1aa7brDYIf1J8C7d3aa1HGI5UKHIJEsI6Xa0yfazzR99Mi2TMuZ02hxpCKhcTR83dIK/vIXHugq 26NUmWS+uh9hNKGoAvVTk7+A6TWmtpR98fxMydHN45s8hz3CFMdRYGFRpHGs0Qf7Y6EQ2gSTQN7 nE9twd0ZyCEbPk9/VDR+jXubS7mmiW3d3hHIOgVpqobRsUnnA/CrJSHnHVnWOQaMEKsOeVuXYHR 2775uWmkG7Kn+wmW4WN2ym0eRKwCuhdp0wE7F6Su4bpWuCfvEdgaDj2UVDvewg4R8oqtspZ76Qz 32J1xOOrKVVcyzqZMYUg9r5bgZBJYc3e9QcjVtPaKEUMY4MHDLnS9iG1RBf6jHl0S07aLO27GH5 RByNZvMscTRHjFI6RElFisxgxas2dIHti1D09HeboSqXy/b/gBa4KW7tTxtvqj2s/tnHtbsf4+x 4KqlXr4FJJGzv6ALjGQ== X-Proofpoint-ORIG-GUID: aELmddGPVAaMvlKveXS256GpF5U1nMrg 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-05-14_04,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 bulkscore=0 impostorscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 adultscore=0 malwarescore=0 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605140160 Content-Type: text/plain; charset="utf-8" The APR transport currently serializes all incoming packets through a single work item and a global RX queue. If one service callback blocks or takes a long time to complete, packet processing for all other services is delayed. Move RX buffering and work items from the packet router to each individual service. Incoming packets are queued on a per-service list and processed by that service's work item, allowing unrelated services to make progress independently while preserving message ordering within each service. Since queued packets may outlive service removal, add a reference count to keep the service object alive until all queued packets have been processed, and reject new packets once the service begins shutting down. Switch the shared APR workqueue to an unbound reclaim workqueue so that multiple services can process packets in parallel. This also addresses the random CMD timeouts seen with audio commands that are sent to DSP which timeout on the response as they are waiting in the queue for other commands to finish. Signed-off-by: Srinivas Kandagatla --- drivers/soc/qcom/apr.c | 265 +++++++++++++++++++++++------------ include/linux/soc/qcom/apr.h | 6 + 2 files changed, 185 insertions(+), 86 deletions(-) diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c index 68b357462438..f25219b48cdc 100644 --- a/drivers/soc/qcom/apr.c +++ b/drivers/soc/qcom/apr.c @@ -28,14 +28,11 @@ struct packet_router { struct rpmsg_endpoint *ch; struct device *dev; spinlock_t svcs_lock; - spinlock_t rx_lock; struct idr svcs_idr; int dest_domain_id; int type; struct pdr_handle *pdr; struct workqueue_struct *rxwq; - struct work_struct rx_work; - struct list_head rx_list; }; =20 struct apr_rx_buf { @@ -74,54 +71,58 @@ int apr_send_pkt(struct apr_device *adev, struct apr_pk= t *pkt) } EXPORT_SYMBOL_GPL(apr_send_pkt); =20 -void gpr_free_port(gpr_port_t *port) +static void apr_svc_release(struct kref *ref) { - struct packet_router *gpr =3D port->pr; - unsigned long flags; + struct pkt_router_svc *svc; =20 - spin_lock_irqsave(&gpr->svcs_lock, flags); - idr_remove(&gpr->svcs_idr, port->id); - spin_unlock_irqrestore(&gpr->svcs_lock, flags); + svc =3D container_of(ref, struct pkt_router_svc, refcount); =20 - kfree(port); + if (svc->dynamic_svc) + kfree(svc); } -EXPORT_SYMBOL_GPL(gpr_free_port); =20 -gpr_port_t *gpr_alloc_port(struct apr_device *gdev, struct device *dev, - gpr_port_cb cb, void *priv) +static void apr_svc_get(struct pkt_router_svc *svc) { - struct packet_router *pr =3D dev_get_drvdata(gdev->dev.parent); - gpr_port_t *port; - struct pkt_router_svc *svc; - int id; + kref_get(&svc->refcount); +} =20 - port =3D kzalloc_obj(*port); - if (!port) - return ERR_PTR(-ENOMEM); +static void apr_svc_put(struct pkt_router_svc *svc) +{ + kref_put(&svc->refcount, apr_svc_release); +} =20 - svc =3D port; - svc->callback =3D cb; - svc->pr =3D pr; - svc->priv =3D priv; - svc->dev =3D dev; - spin_lock_init(&svc->lock); +static void apr_svc_purge_rx(struct pkt_router_svc *svc) +{ + struct apr_rx_buf *abuf, *tmp; + unsigned long flags; =20 - spin_lock(&pr->svcs_lock); - id =3D idr_alloc_cyclic(&pr->svcs_idr, svc, GPR_DYNAMIC_PORT_START, - GPR_DYNAMIC_PORT_END, GFP_ATOMIC); - if (id < 0) { - dev_err(dev, "Unable to allocate dynamic GPR src port\n"); - kfree(port); - spin_unlock(&pr->svcs_lock); - return ERR_PTR(id); + spin_lock_irqsave(&svc->lock, flags); + list_for_each_entry_safe(abuf, tmp, &svc->rx_list, node) { + list_del(&abuf->node); + kfree(abuf); + apr_svc_put(svc); } + spin_unlock_irqrestore(&svc->lock, flags); +} =20 - svc->id =3D id; - spin_unlock(&pr->svcs_lock); +void gpr_free_port(gpr_port_t *port) +{ + struct packet_router *gpr =3D port->pr; + unsigned long flags; =20 - return port; + spin_lock_irqsave(&port->lock, flags); + port->dying =3D true; + spin_unlock_irqrestore(&port->lock, flags); + + spin_lock_irqsave(&gpr->svcs_lock, flags); + idr_remove(&gpr->svcs_idr, port->id); + spin_unlock_irqrestore(&gpr->svcs_lock, flags); + + cancel_work_sync(&port->rx_work); + apr_svc_purge_rx(port); + apr_svc_put(port); } -EXPORT_SYMBOL_GPL(gpr_alloc_port); +EXPORT_SYMBOL_GPL(gpr_free_port); =20 static int pkt_router_send_svc_pkt(struct pkt_router_svc *svc, const struc= t gpr_pkt *pkt) { @@ -155,15 +156,53 @@ static void apr_dev_release(struct device *dev) { struct apr_device *adev =3D to_apr_device(dev); =20 + cancel_work_sync(&adev->svc.rx_work); + apr_svc_purge_rx(&adev->svc); + apr_svc_put(&adev->svc); kfree(adev); } =20 +static struct pkt_router_svc *apr_find_svc(struct packet_router *apr, void= *buf) +{ + struct pkt_router_svc *svc; + unsigned long flags; + uint32_t svc_id; + struct apr_hdr *ahdr; + struct gpr_hdr *ghdr; + + switch (apr->type) { + case PR_TYPE_APR: + ahdr =3D buf; + svc_id =3D ahdr->dest_svc; + break; + case PR_TYPE_GPR: + ghdr =3D buf; + svc_id =3D ghdr->dest_port; + break; + default: + dev_err(apr->dev, "Invalid Packet Router\n"); + return NULL; + } + + spin_lock_irqsave(&apr->svcs_lock, flags); + svc =3D idr_find(&apr->svcs_idr, svc_id); + if (svc) + apr_svc_get(svc); + spin_unlock_irqrestore(&apr->svcs_lock, flags); + + if (!svc) + dev_err(apr->dev, "APR: service is not registered (%d)\n", svc_id); + + return svc; +} + static int apr_callback(struct rpmsg_device *rpdev, void *buf, int len, void *priv, u32 addr) { struct packet_router *apr =3D dev_get_drvdata(&rpdev->dev); struct apr_rx_buf *abuf; unsigned long flags; + struct pkt_router_svc *svc; =20 switch (apr->type) { case PR_TYPE_APR: @@ -189,24 +228,35 @@ static int apr_callback(struct rpmsg_device *rpdev, v= oid *buf, abuf->len =3D len; memcpy(abuf->buf, buf, len); =20 - spin_lock_irqsave(&apr->rx_lock, flags); - list_add_tail(&abuf->node, &apr->rx_list); - spin_unlock_irqrestore(&apr->rx_lock, flags); + svc =3D apr_find_svc(apr, buf); + if (!svc) { + kfree(abuf); + return 0; + } + + spin_lock_irqsave(&svc->lock, flags); + if (svc->dying) { + spin_unlock_irqrestore(&svc->lock, flags); + kfree(abuf); + apr_svc_put(svc); + return 0; + } + + list_add_tail(&abuf->node, &svc->rx_list); + spin_unlock_irqrestore(&svc->lock, flags); =20 - queue_work(apr->rxwq, &apr->rx_work); + queue_work(apr->rxwq, &svc->rx_work); =20 return 0; } =20 -static int apr_do_rx_callback(struct packet_router *apr, struct apr_rx_buf= *abuf) +static int apr_do_rx_callback(struct pkt_router_svc *svc, struct apr_rx_bu= f *abuf) { - uint16_t hdr_size, msg_type, ver, svc_id; - struct pkt_router_svc *svc; - struct apr_device *adev; + uint16_t hdr_size, msg_type, ver; + struct apr_device *adev =3D NULL; struct apr_driver *adrv =3D NULL; struct apr_resp_pkt resp; struct apr_hdr *hdr; - unsigned long flags; void *buf =3D abuf->buf; int len =3D abuf->len; =20 @@ -217,18 +267,18 @@ static int apr_do_rx_callback(struct packet_router *a= pr, struct apr_rx_buf *abuf =20 hdr_size =3D APR_HDR_FIELD_SIZE_BYTES(hdr->hdr_field); if (hdr_size < APR_HDR_SIZE) { - dev_err(apr->dev, "APR: Wrong hdr size:%d\n", hdr_size); + dev_err(svc->dev, "APR: Wrong hdr size:%d\n", hdr_size); return -EINVAL; } =20 if (hdr->pkt_size < APR_HDR_SIZE || hdr->pkt_size !=3D len) { - dev_err(apr->dev, "APR: Wrong packet size\n"); + dev_err(svc->dev, "APR: Wrong packet size\n"); return -EINVAL; } =20 msg_type =3D APR_HDR_FIELD_MT(hdr->hdr_field); if (msg_type >=3D APR_MSG_TYPE_MAX) { - dev_err(apr->dev, "APR: Wrong message type: %d\n", msg_type); + dev_err(svc->dev, "APR: Wrong message type: %d\n", msg_type); return -EINVAL; } =20 @@ -236,22 +286,17 @@ static int apr_do_rx_callback(struct packet_router *a= pr, struct apr_rx_buf *abuf hdr->dest_domain >=3D APR_DOMAIN_MAX || hdr->src_svc >=3D APR_SVC_MAX || hdr->dest_svc >=3D APR_SVC_MAX) { - dev_err(apr->dev, "APR: Wrong APR header\n"); + dev_err(svc->dev, "APR: Wrong APR header\n"); return -EINVAL; } =20 - svc_id =3D hdr->dest_svc; - spin_lock_irqsave(&apr->svcs_lock, flags); - svc =3D idr_find(&apr->svcs_idr, svc_id); if (svc && svc->dev->driver) { adev =3D svc_to_apr_device(svc); adrv =3D to_apr_driver(adev->dev.driver); } - spin_unlock_irqrestore(&apr->svcs_lock, flags); =20 if (!adrv || !adev) { - dev_err(apr->dev, "APR: service is not registered (%d)\n", - svc_id); + dev_err(svc->dev, "APR: service device not found\n"); return -EINVAL; } =20 @@ -270,13 +315,11 @@ static int apr_do_rx_callback(struct packet_router *a= pr, struct apr_rx_buf *abuf return 0; } =20 -static int gpr_do_rx_callback(struct packet_router *gpr, struct apr_rx_buf= *abuf) +static int gpr_do_rx_callback(struct pkt_router_svc *svc, struct apr_rx_bu= f *abuf) { uint16_t hdr_size, ver; - struct pkt_router_svc *svc =3D NULL; struct gpr_resp_pkt resp; struct gpr_hdr *hdr; - unsigned long flags; void *buf =3D abuf->buf; int len =3D abuf->len; =20 @@ -287,12 +330,12 @@ static int gpr_do_rx_callback(struct packet_router *g= pr, struct apr_rx_buf *abuf =20 hdr_size =3D hdr->hdr_size; if (hdr_size < GPR_PKT_HEADER_WORD_SIZE) { - dev_err(gpr->dev, "GPR: Wrong hdr size:%d\n", hdr_size); + dev_err(svc->dev, "GPR: Wrong hdr size:%d\n", hdr_size); return -EINVAL; } =20 if (hdr->pkt_size < GPR_PKT_HEADER_BYTE_SIZE || hdr->pkt_size !=3D len) { - dev_err(gpr->dev, "GPR: Wrong packet size\n"); + dev_err(svc->dev, "GPR: Wrong packet size\n"); return -EINVAL; } =20 @@ -306,49 +349,91 @@ static int gpr_do_rx_callback(struct packet_router *g= pr, struct apr_rx_buf *abuf if (resp.payload_size > 0) resp.payload =3D buf + (hdr_size * 4); =20 - - spin_lock_irqsave(&gpr->svcs_lock, flags); - svc =3D idr_find(&gpr->svcs_idr, hdr->dest_port); - spin_unlock_irqrestore(&gpr->svcs_lock, flags); - - if (!svc) { - dev_err(gpr->dev, "GPR: Port(%x) is not registered\n", - hdr->dest_port); - return -EINVAL; - } - if (svc->callback) svc->callback(&resp, svc->priv, 0); =20 return 0; } =20 -static void apr_rxwq(struct work_struct *work) +static void apr_service_rxwq(struct work_struct *work) { - struct packet_router *apr =3D container_of(work, struct packet_router, rx= _work); + struct pkt_router_svc *svc =3D container_of(work, struct pkt_router_svc, = rx_work); + struct packet_router *apr =3D svc->pr; struct apr_rx_buf *abuf, *b; unsigned long flags; =20 - if (!list_empty(&apr->rx_list)) { - list_for_each_entry_safe(abuf, b, &apr->rx_list, node) { + for (;;) { + LIST_HEAD(local); + + spin_lock_irqsave(&svc->lock, flags); + if (list_empty(&svc->rx_list)) { + spin_unlock_irqrestore(&svc->lock, flags); + break; + } + + list_splice_init(&svc->rx_list, &local); + spin_unlock_irqrestore(&svc->lock, flags); + + list_for_each_entry_safe(abuf, b, &local, node) { switch (apr->type) { case PR_TYPE_APR: - apr_do_rx_callback(apr, abuf); + apr_do_rx_callback(svc, abuf); break; case PR_TYPE_GPR: - gpr_do_rx_callback(apr, abuf); + gpr_do_rx_callback(svc, abuf); break; default: break; } - spin_lock_irqsave(&apr->rx_lock, flags); + apr_svc_put(svc); list_del(&abuf->node); - spin_unlock_irqrestore(&apr->rx_lock, flags); kfree(abuf); } } } =20 +gpr_port_t *gpr_alloc_port(struct apr_device *gdev, struct device *dev, + gpr_port_cb cb, void *priv) +{ + struct packet_router *pr =3D dev_get_drvdata(gdev->dev.parent); + gpr_port_t *port; + struct pkt_router_svc *svc; + int id; + + port =3D kzalloc_obj(*port); + if (!port) + return ERR_PTR(-ENOMEM); + + svc =3D port; + svc->callback =3D cb; + svc->pr =3D pr; + svc->priv =3D priv; + svc->dying =3D false; + svc->dynamic_svc =3D true; + svc->dev =3D dev; + spin_lock_init(&svc->lock); + + INIT_WORK(&svc->rx_work, apr_service_rxwq); + INIT_LIST_HEAD(&svc->rx_list); + kref_init(&svc->refcount); + + spin_lock(&pr->svcs_lock); + id =3D idr_alloc_cyclic(&pr->svcs_idr, svc, GPR_DYNAMIC_PORT_START, + GPR_DYNAMIC_PORT_END, GFP_ATOMIC); + if (id < 0) { + dev_err(dev, "Unable to allocate dynamic GPR src port\n"); + kfree(port); + spin_unlock(&pr->svcs_lock); + return ERR_PTR(id); + } + + svc->id =3D id; + spin_unlock(&pr->svcs_lock); + + return port; +} +EXPORT_SYMBOL_GPL(gpr_alloc_port); + static int apr_device_match(struct device *dev, const struct device_driver= *drv) { struct apr_device *adev =3D to_apr_device(dev); @@ -390,6 +475,11 @@ static void apr_device_remove(struct device *dev) struct apr_device *adev =3D to_apr_device(dev); struct apr_driver *adrv =3D to_apr_driver(dev->driver); struct packet_router *apr =3D dev_get_drvdata(adev->dev.parent); + unsigned long flags; + + spin_lock_irqsave(&adev->svc.lock, flags); + adev->svc.dying =3D true; + spin_unlock_irqrestore(&adev->svc.lock, flags); =20 if (adrv->remove) adrv->remove(adev); @@ -437,9 +527,15 @@ static int apr_add_device(struct device *dev, struct d= evice_node *np, svc->id =3D svc_id; svc->pr =3D apr; svc->priv =3D adev; + svc->dying =3D false; svc->dev =3D dev; + svc->dynamic_svc =3D false; spin_lock_init(&svc->lock); =20 + INIT_WORK(&svc->rx_work, apr_service_rxwq); + INIT_LIST_HEAD(&svc->rx_list); + kref_init(&svc->refcount); + adev->domain_id =3D domain_id; =20 if (np) @@ -488,7 +584,6 @@ static int apr_add_device(struct device *dev, struct de= vice_node *np, dev_err(dev, "device_register failed: %d\n", ret); put_device(&adev->dev); } - out: return ret; } @@ -629,12 +724,12 @@ static int apr_probe(struct rpmsg_device *rpdev) dev_set_drvdata(dev, apr); apr->ch =3D rpdev->ept; apr->dev =3D dev; - apr->rxwq =3D create_singlethread_workqueue("qcom_apr_rx"); + + apr->rxwq =3D alloc_workqueue("qcom_apr_rx", WQ_UNBOUND | WQ_MEM_RECLAIM,= 0); if (!apr->rxwq) { dev_err(apr->dev, "Failed to start Rx WQ\n"); return -ENOMEM; } - INIT_WORK(&apr->rx_work, apr_rxwq); =20 apr->pdr =3D pdr_handle_alloc(apr_pd_status, apr); if (IS_ERR(apr->pdr)) { @@ -643,8 +738,6 @@ static int apr_probe(struct rpmsg_device *rpdev) goto destroy_wq; } =20 - INIT_LIST_HEAD(&apr->rx_list); - spin_lock_init(&apr->rx_lock); spin_lock_init(&apr->svcs_lock); idr_init(&apr->svcs_idr); =20 diff --git a/include/linux/soc/qcom/apr.h b/include/linux/soc/qcom/apr.h index 58fa1df96347..f5bc55c3d025 100644 --- a/include/linux/soc/qcom/apr.h +++ b/include/linux/soc/qcom/apr.h @@ -3,6 +3,7 @@ #ifndef __QCOM_APR_H_ #define __QCOM_APR_H_ =20 +#include #include #include #include @@ -129,6 +130,11 @@ struct pkt_router_svc { gpr_port_cb callback; struct packet_router *pr; spinlock_t lock; + struct work_struct rx_work; + struct list_head rx_list; + struct kref refcount; + bool dying; + bool dynamic_svc; int id; void *priv; }; --=20 2.47.3