From nobody Tue Sep 29 13:20:15 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 4EFB33914E5 for ; Fri, 7 Aug 2026 16:03:52 +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=1786118633; cv=none; b=YW0MRA2CgkwMpUgaaPWpC14nXODQ2ubKGhcbspuDWcjX4jD1J07TiAQGjTr2CFLWTP80GbLkU/ac7/QK8GpzQt9qYF5KS7IbGTFrCWxF4r1LVK5RTKq5kdN+mjcsagdvKNRwf9HKEaDiHeFD87kSXAGRvyK6IFQN8HsJMz6s8T8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786118633; c=relaxed/simple; bh=VJC+axUEzaBSoO0VtJxO/+rwIcuV7Eh3fVzKu6++viw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=d2Se4K1TtmrNbUzKpZ11SDAzE/vxLU9aF/2FhX/fsUtVy5m13woCObTWHj1tNKcW339K384PgXDSNs3JSDNLa/nViisIV+p7mcQxrKZPFxaQcOFG6rvcfrvuTLWPX9dAohV43OafM1BjKtVGWiI5iKhx0VJfOII0aG648S1RVQo= 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=hZScoCv+; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=fzRx6wjk; 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="hZScoCv+"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="fzRx6wjk" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 677FRUYl1095585 for ; Fri, 7 Aug 2026 16:03:51 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=5UjAnZ9ViRt 33rjDZPE280PLOd5WIz0gWwcOlJyBbfE=; b=hZScoCv+kqropJ9YR5uFkdQdHHc PGlwkQPcp/uolFoSgQoRj/lFDjN/NyWuAvQDHBx9JhO68mT5UB5lbCQNDJYsErJY C3YioFGco/NwibPi48EQadGH4xHHgISIoTykwXUCjFi+ACMoxA91JmcZ0Vs+t7t+ cpJndKxtI8ZzM5DQOLZpSsznzPM9hF7j/vr8oEdkMiqohQW4Dz/DhX12C0jHdUzl Xc7+k4hzWsbRNnjkKAshXKs4+pRgvd61Wr7ZQNTEZBHZpLqeAPXQ0zp/jrRT1K1W REwj5ENW0fYDv4RSxTYC9KmVEBbIrOPrN89Gws2QZj84Cqj+djKGzcK4NPg== Received: from mail-vk1-f200.google.com (mail-vk1-f200.google.com [209.85.221.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fwgem8kqu-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 07 Aug 2026 16:03:51 +0000 (GMT) Received: by mail-vk1-f200.google.com with SMTP id 71dfb90a1353d-5c385784778so776242e0c.0 for ; Fri, 07 Aug 2026 09:03:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1786118630; x=1786723430; 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:content-type; bh=5UjAnZ9ViRt33rjDZPE280PLOd5WIz0gWwcOlJyBbfE=; b=fzRx6wjksov0rIUtqm0rLAnawe8wnlkBf4CCFoGxoBvzW1c5vZyCwfE3dqodSmRefi ZSneFpeqrAE5n9QtdnrZGClGWQCO3x30+yuyKQICbZbQa7WW1kQ2b3Gv/DZ0Fcp8Xoqf vDA04uLDukx0dFQxvtSG4O3/VtLtxrRQAGWSf91SiCEFfrv8JefQ7WhZMJY0SxG2innx uiu9EPZpnAIIQLO/QexLrv6tWfwE4aXNyreMbeoSYP/2Itt3oR5H53ASLhwbutFK6JJK jjQ6wRbNIrgAeM2SeLNS5hRRimU4aJvM99M1510PWgT1EEf4DCwXfA33VXgC7+akjMKp 1QSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786118630; x=1786723430; 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:content-type; bh=5UjAnZ9ViRt33rjDZPE280PLOd5WIz0gWwcOlJyBbfE=; b=DxbuCk6j5MYTt9h36b6vhfqeCh3NJ3qKtSFH6Jf+UCJoQHldawf5SHxy9vjAigQSNf DtSY0jWC86j+shXGLLvpJ3reNVWbtpZqg2oQIx7PHRtrPYZQYG+TujDhhI40tH8BHNqD 3A/JE2801rqWbjRadpX/lA3fPhBiwrQdD9oGmDGrmXFmwpHVqqiwjDjk8Im3J6jJwbu8 jy2RBauIE0ftwcbEmVQuD2jIQPVRQ8w+9IK+zqq0gRK8IRg+tY4DGBcnPoB8u/QVirAD j7//Di1/ttNRaAqGvDuSReD3NnmB0jxVF2yQte4fndhMzfuZM7IfKzBBVMzfso/CvjOP 1GKA== X-Forwarded-Encrypted: i=1; AHgh+Rod6VMLeihJn5UXsPSFCr0p81c9BLB5YaxhUP+7enplvKyWpMKfq5mizI9tmb9K3utPNQxxma95M8n8qxY=@vger.kernel.org X-Gm-Message-State: AOJu0Yzjr+c79f4wPF8cuRtjDIZzjAgxiy1w3cuNdZ0o3u3QV2Sin3te TDgqgU3O+1sK/LndHsmIGKnrQh0eIzLNxlx+o8BajR9KWh/ptQ6yHZeES48RT2S+LukWNqvOR8Z mf2aP1GHFko3JDVQD5LRIKuzE2tAGCQ8OGYAtxTMX0CoGNm1yEio2nOifQ1iz1CIKWJ4= X-Gm-Gg: AR+sD12YVLjleEU8JrTvZvLGTfTcRViSXZ7fbreLusHVV8uulL1CY64TK6EqPx9pMn+ epY6kKX+EWiBMQhKpct2AMSJK3zUChtDgppctXEyYpqsIt8+Vq1cvPIKEB52zYejWo2cutr0L05 +4iUADqAPVy3QhPQhvb+1FeR5fkg5IrUHd2qHJuFfigesDN2zlEVT1xo5GCW1UOORPQ7JVbLe5e jOGaH2KQbUxVrjwDMipL/8KXh32jYVwC6UKDBdIhwfBZarMCwbdvs/QDoW4Ub9iBu5lZqJYqoYx EfvVIkqwEg31CqBc6D3iz9LrYDsBAHw0e3J94M8s1i+RxjsqkNhk72ouceTWi6G7BpUstCkRUIF P0JBWTQwLHCJ5wYJr4E3fsguh1zp6qp8= X-Received: by 2002:a05:6123:ac:b0:5c1:3ed2:fd48 with SMTP id 71dfb90a1353d-5c3d9281eabmr3027536e0c.14.1786118630572; Fri, 07 Aug 2026 09:03:50 -0700 (PDT) X-Received: by 2002:a05:6123:ac:b0:5c1:3ed2:fd48 with SMTP id 71dfb90a1353d-5c3d9281eabmr3027524e0c.14.1786118630171; Fri, 07 Aug 2026 09:03:50 -0700 (PDT) Received: from QCOM-WFsSr66Fqw.qualcomm.com ([212.136.9.4]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2080a2b1f1sm71367466b.12.2026.08.07.09.03.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Aug 2026 09:03:49 -0700 (PDT) From: Igor Skalkin To: Marcel Holtmann , Luiz Augusto von Dentz Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, Trilok Soni , Igor Skalkin Subject: [PATCH 1/2] Bluetooth: virtio: fix RX buffer size Date: Fri, 7 Aug 2026 18:03:24 +0200 Message-ID: <20260807160325.1921-2-igor.skalkin@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260807160325.1921-1-igor.skalkin@oss.qualcomm.com> References: <20260807160325.1921-1-igor.skalkin@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-ORIG-GUID: kZ-71zvFZr2b82mYXD0FQzyzl5ccFTdk X-Proofpoint-GUID: kZ-71zvFZr2b82mYXD0FQzyzl5ccFTdk X-Proofpoint-Spam-Info: AW1haW4tMjYwODA3MDEyNSBTYWx0ZWRfX6/bG+w/978sj Ygl2DcEc/3lc2Ozz56UgPwUn+ye58/bAAgfFv0IQTIGW82TP89rffOIBC4p0vGtKgEP3z8X/UbC gv+9YQme4lleMQg+G2fPgF2VGbeiTdU= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODA3MDEyNSBTYWx0ZWRfX5WMShgHsyw1u eCDr21KrM2gMZA+gMCUFA9nckK0Nz6J6B0IAgA5AayNQ96o15BSxLtQ+jWRYN4KfMBHiJRKr23J 1/vK+nBuIDjnAf7QGlLW/4wTV59KV7zbuzVEbt0CAmkKClwQnPaniAvgKldy+WO4ehRLFe49DHK gC1LQjhzOepIfzGowhTSLW/+Mm7cl+GnmuePQRRh1b5kaWoAUNkDfmCxGzLoHcwOjznXnLtpV29 hXqu831C/nqSxHXm7x+JCZaKBGpuoxwmakrMrqjcvOKvR/zZ/5Iq80boU1R0paiu6NLnJAgjyNp sRq85wWeVVGYsopK6U2oK6rqR4ogDVq6OrXdDOBf9d0cm/SQ0shDCS1SykXxfxhYN9aZlSSdEjO XfThJ+PhwkPOpW30d6brGGl81VvFHxxBo6pQlT1owY6vcx6Vo5UQJfT41N4x0eTI8CbWjHqYtvI jjnXqWynJIC7nfzkvEA== X-Authority-Analysis: v=2.4 cv=X9Ni7mTe c=1 sm=1 tr=0 ts=6a7601e7 cx=c_pps a=wuOIiItHwq1biOnFUQQHKA==:117 a=dNlqnMcrdpbb+gQrTujlOQ==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=ZAI0rBDq9e1UAK1rQ-kA:9 a=XD7yVLdPMpWraOa8Un9W:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-07_02,2026-08-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 bulkscore=0 phishscore=0 malwarescore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 impostorscore=0 suspectscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608070125 Content-Type: text/plain; charset="utf-8" The fixed 1000-byte RX buffer is too small for an HCI frame at the advertised ACL MTU. Size the buffer for HCI_MAX_FRAME_SIZE and one HCI packet-type byte instead. Signed-off-by: Igor Skalkin --- drivers/bluetooth/virtio_bt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c index 140ab55c9..96f21501e 100644 --- a/drivers/bluetooth/virtio_bt.c +++ b/drivers/bluetooth/virtio_bt.c @@ -12,7 +12,7 @@ #include =20 #define VERSION "0.1" -#define VIRTBT_RX_BUF_SIZE 1000 +#define VIRTBT_RX_BUF_SIZE (HCI_MAX_FRAME_SIZE + 1) =20 enum { VIRTBT_VQ_TX, --=20 2.53.0 From nobody Tue Sep 29 13:20:15 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 63BBA42CAFD for ; Fri, 7 Aug 2026 16:03:54 +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=1786118636; cv=none; b=nxlV/XgzMN/UC60pdYB+TuHW/subf/mFFyowfpLfk/shwKwox2h0ytn8yyN7fhO9FJJqEZqKjHVcsDBQiTjukxphnUkOOtNEpNwCK696G4fpirkJAHN5rTGj/SEhlEYvH4PhOycbJp3uv7Ue7drnZQ5SlejWUb26IXNiRWsumpA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786118636; c=relaxed/simple; bh=xr7IZ1c7NwmZA4RQrJXLfJ6PojPblLJHcTykBtNdaFQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GjM7MgiNyTz8LBVIppqdX3IRMh9KqfnkdbXQTHIYzbox272wm1kF5gTUXh1lNfIJGLEQBXLv8LUSDqlTYN9uWxTbO1VwG7OgyI17A7IMId4PFlW1iwZYJlVABRw5pqMZs+0Qer1r0omuGfSuFlr/sxuC4KFD+lolVmNCw5ZDkBM= 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=T8/y8qwP; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=VmEWF6ro; 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="T8/y8qwP"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="VmEWF6ro" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 677FRqLi1318223 for ; Fri, 7 Aug 2026 16:03:53 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=TFIH3uLfCuh r9Xp/AxmNBdE75An+xiOuj1/gYyyJOIY=; b=T8/y8qwPOUL+NGo3bCJNdirmiV9 r+vucJ1z1/c9+4NRWkxwWC/6FmJ0+ef+3KxzmX2+ywjChS2v8lFzpjLkLBrksBdY P2puK+JJy4c9zT9Pu6TPpmJ9vyzQbGXuinkQei2q06Y/mxobqMCA5jgQAPL18+KW 7ekRMYfjyo0Ov8yh4pOq/tN+V9wNRPA5lEBEj+bXbyiC47xc/04mmIr39uYWKVED Wbhw3tZcCw4uBE5VVPd5Y80XOMr57RuSsmA0etS2UAKS1X3FtGCH2rxLkXz9FLie G2Dx9hhXo6aKBUpJEhRh9vwXx52w3yGzb0jadj8btOlTerJC8TzWQabIQQg== Received: from mail-vk1-f197.google.com (mail-vk1-f197.google.com [209.85.221.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fvy6hcsgc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 07 Aug 2026 16:03:53 +0000 (GMT) Received: by mail-vk1-f197.google.com with SMTP id 71dfb90a1353d-5c110ad1b2fso626237e0c.2 for ; Fri, 07 Aug 2026 09:03:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1786118632; x=1786723432; 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:content-type; bh=TFIH3uLfCuhr9Xp/AxmNBdE75An+xiOuj1/gYyyJOIY=; b=VmEWF6ror4CMiMMt/ABsgesHj/Mvxf9ixNDa1G7v3Otw7uxOtc9IW4LZvg2yLqV+hV hvfDZhlJJpLzxrAn+hYhFmsZQZd3WTimXT4SEbrjmE0BQJrejttE1G89SCgkF1VOGhRG 6PQJJzwaILLVHEmbhwGYJSJtZ9Y279SlwwVbMa7LZR0dhAgN3Od5YoI1vpy4tLALM5FH dtjXUMrFlZaKdMStmQAV7GBFVu/0anO9Ua5Zg7Ay6V0iedAldTMWMq3NFBel9swpOhG9 Xvzvu2F8fEKZvzForl65o7wG/PrPme7ACGO/bSs7kV0hjolu+zmJ3M+94sSvk2ldHKk0 9r5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786118632; x=1786723432; 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:content-type; bh=TFIH3uLfCuhr9Xp/AxmNBdE75An+xiOuj1/gYyyJOIY=; b=WrMBLyu6ZM6Hske7HlatLLMqMt7LMoZdlrhwwsi2cTba7JqjtgA4sc+Kpx2YRWGMOm 9cp8UzmtSA2/xJKIBC7KoOEzCckSg1ZZy1xLh2SgmL8V10AFcebnCpDn7cvVUXAczeEp 8jdU3VAZ9eN//nvJ8SLvCwYnBAyc2m4jVGWlBKvkDKAnlqBGT5DyQNsoPQDuH5tJ2rSf VSzLqQpMCDXS72lDri0rLdqfJRsMEF7uvS5vJw5HeQGQtCbk7324NfEd1w4a5+NwW4kr ulmer2x3qLaH03fE/lAa11qhIkcVWM3mSp8m5u2yB8Hfdlljn5rhm5rRA0WCgStYngc1 GAIQ== X-Forwarded-Encrypted: i=1; AHgh+Rr085w0wl4zm2EC7Zn3e41G9ZhNr6bCEab1/LFTjSzW2UTufEXri1KJKv30N8rZBSi7xWk2p/kEEjlY4PU=@vger.kernel.org X-Gm-Message-State: AOJu0YyLiW3CeJsCuj3M9RpgjcEqpDs0KhCbZMgqMr7T6vKjtQ6yTQoZ jgzzVIPWPqVn6co635ulRsdtGRzWQqgnQtErkXk9Nij8m7/OCJLQMknQ347Z7shDoHZG7eOvrEn f69h+JEl2G0xmvw7iTcW/50ft9Kv9A4nOeBj4fjKSsBThre4WKnisXg4wIJRMch9+3fPBPNscGo I= X-Gm-Gg: AR+sD11Grs83v0IblwNd0ZjD6L8Y/wdYiA5MN1KKrBCetrww4n2t3ZfFd6HYFEXEr33 bIYnNH9Fcgzi9W4CZDMm61Wmj2VQVltZvZjGiKey8AtqqBE6Sq0XzaD2brHiNsn6Xoq9ZQO6rGv LR3I/4ZJzvgzfXVl37mVk7mgispThqV9Lqs7lUULc1ncj6WU0z1E1ANvwWoXJ70F/Wsb8C885yS eIMnzLlPNWN9UM4X/PQjhAQloJPLCG8+370Aou3BE5WlPh7yE2wLA6DXQ3Gtex5AWvltmQ5fMi+ ddy4HBgynGb8QX6iiKYZ9emJWJiF56ytQ47fH35SFaoW+bc5OpOoj7LZnYV/MZu7Uvf9L+0sKLd qbc9GQkpkiqucues6V5EEpIJdMMml8ws= X-Received: by 2002:a05:6122:4b10:b0:56d:b639:5c0d with SMTP id 71dfb90a1353d-5c40959e017mr602881e0c.13.1786118632270; Fri, 07 Aug 2026 09:03:52 -0700 (PDT) X-Received: by 2002:a05:6122:4b10:b0:56d:b639:5c0d with SMTP id 71dfb90a1353d-5c40959e017mr602841e0c.13.1786118631762; Fri, 07 Aug 2026 09:03:51 -0700 (PDT) Received: from QCOM-WFsSr66Fqw.qualcomm.com ([212.136.9.4]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2080a2b1f1sm71367466b.12.2026.08.07.09.03.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Aug 2026 09:03:50 -0700 (PDT) From: Igor Skalkin To: Marcel Holtmann , Luiz Augusto von Dentz Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, Trilok Soni , Igor Skalkin Subject: [PATCH 2/2] Bluetooth: virtio: process RX buffers in virtqueue callback Date: Fri, 7 Aug 2026 18:03:25 +0200 Message-ID: <20260807160325.1921-3-igor.skalkin@oss.qualcomm.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260807160325.1921-1-igor.skalkin@oss.qualcomm.com> References: <20260807160325.1921-1-igor.skalkin@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: _VsGTRHUhONyVd4vYmBhakRlaHai8I1Q X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODA3MDEyNSBTYWx0ZWRfX8Frr3fFkjhKk pP1RmjbPdgWTtRzzKSM/5Tf+DH8dyt+ZlRMKzNlVVIwYewKlTNOvjfaWqvfQuEgz0vmtij9x0NF /AICig5utUD2MASXPzLdsKRA4XRHXc5OtSsYjWuHiIxtWrYoC5I53kr5dQLrClljYgsUoWflsQz pryZ4e6t5Mo/39+xR2gNud5qpvQp3RESdAf47x6KJUQsu6N1KLrZSYob0DB7FY8MSjMbuRjLUOp D5hXy2XuL7Ioj7pu9XtZeSba4TqYpsaJR2uApJgtV0Zt+BSnV4vaJWlVKb7vOog7xSOtWiMiBpv qM2M3+uMLc8uY5YsXvW94WoB4XAreBHMtao+xuYZPs7zV3W81l176Ty86IkuXbFWPXoWSV0KvQ/ 45Ua30+btuDzG1PmkhH0bQGLFvJ/Q2M60E8Q6fK2vFIGKoyvFhlN3QTi2hNf6yDKRr46fZ/SLtM 4/B7cdkyAOJHu6sm8XA== X-Proofpoint-Spam-Info: AW1haW4tMjYwODA3MDEyNSBTYWx0ZWRfX6KSsz5/4DJ00 bHpvoGaJrMvnz/hkyjAsgyWc8C7c7XrQXXiwsbeYaxzDhvCdc5vMmT8+nIKKLfvrpD98y3jKewS RXS9THWy4DpZk1TX99FGwxO0ZHxZJjw= X-Proofpoint-ORIG-GUID: _VsGTRHUhONyVd4vYmBhakRlaHai8I1Q X-Authority-Analysis: v=2.4 cv=MbpcfZ/f c=1 sm=1 tr=0 ts=6a7601e9 cx=c_pps a=JIY1xp/sjQ9K5JH4t62bdg==:117 a=dNlqnMcrdpbb+gQrTujlOQ==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=Ya1WsiqdJGzvDigZ0kQA:9 a=tNoRWFLymzeba-QzToBc:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-07_02,2026-08-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 adultscore=0 priorityscore=1501 clxscore=1015 malwarescore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 spamscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608070125 Content-Type: text/plain; charset="utf-8" The RX virtqueue is sized for many in-flight descriptors (64 on virtio-bt-pci), but the driver only ever posts a single buffer: virtbt_open_vdev() posts one buffer at open, and the RX callback replenishes exactly the one buffer it just consumed before kicking again. The device can never have more than one RX descriptor available, so every received frame serializes behind a full kick/interrupt/workqueue round trip before the next one can even be queued. Drain all completed RX buffers from the virtqueue callback and pass valid frames directly to hci_recv_frame(). Populate the RX ring until it is full and replenish each consumed buffer in callback context with GFP_ATOMIC. Keep a worker solely to retry refills with GFP_KERNEL after an atomic allocation failure. Serialize callback, refill, and teardown access to the RX virtqueue so a refill cannot race with device removal. Signed-off-by: Igor Skalkin --- drivers/bluetooth/virtio_bt.c | 137 ++++++++++++++++++++++++++-------- 1 file changed, 107 insertions(+), 30 deletions(-) diff --git a/drivers/bluetooth/virtio_bt.c b/drivers/bluetooth/virtio_bt.c index 96f21501e..cb42b322b 100644 --- a/drivers/bluetooth/virtio_bt.c +++ b/drivers/bluetooth/virtio_bt.c @@ -23,24 +23,39 @@ enum { struct virtio_bluetooth { struct virtio_device *vdev; struct virtqueue *vqs[VIRTBT_NUM_VQS]; - struct work_struct rx; + struct work_struct rx_refill; + /* Serializes RX virtqueue operations and teardown. */ + spinlock_t rx_lock; struct hci_dev *hdev; + unsigned int rx_buf_count; + bool stopped; }; =20 -static int virtbt_add_inbuf(struct virtio_bluetooth *vbt) +static int virtbt_add_inbuf(struct virtio_bluetooth *vbt, gfp_t gfp) { struct virtqueue *vq =3D vbt->vqs[VIRTBT_VQ_RX]; struct scatterlist sg[1]; struct sk_buff *skb; + unsigned long flags; int err; =20 - skb =3D alloc_skb(VIRTBT_RX_BUF_SIZE, GFP_KERNEL); + skb =3D alloc_skb(VIRTBT_RX_BUF_SIZE, gfp); if (!skb) return -ENOMEM; =20 sg_init_one(sg, skb->data, VIRTBT_RX_BUF_SIZE); =20 - err =3D virtqueue_add_inbuf(vq, sg, 1, skb, GFP_KERNEL); + spin_lock_irqsave(&vbt->rx_lock, flags); + if (vbt->stopped) { + err =3D -ESHUTDOWN; + } else { + /* The lock serializes RX callback and refill worker producers. */ + err =3D virtqueue_add_inbuf(vq, sg, 1, skb, GFP_ATOMIC); + if (!err) + vbt->rx_buf_count++; + } + spin_unlock_irqrestore(&vbt->rx_lock, flags); + if (err < 0) { kfree_skb(skb); return err; @@ -56,10 +71,20 @@ static int virtbt_open(struct hci_dev *hdev) =20 static int virtbt_open_vdev(struct virtio_bluetooth *vbt) { - if (virtbt_add_inbuf(vbt) < 0) + struct virtqueue *vq =3D vbt->vqs[VIRTBT_VQ_RX]; + int err; + + if (!virtqueue_get_vring_size(vq)) return -EIO; =20 - virtqueue_kick(vbt->vqs[VIRTBT_VQ_RX]); + do { + err =3D virtbt_add_inbuf(vbt, GFP_KERNEL); + } while (!err); + + if (!vbt->rx_buf_count) + return err; + + virtqueue_kick(vq); return 0; } =20 @@ -70,9 +95,15 @@ static int virtbt_close(struct hci_dev *hdev) =20 static int virtbt_close_vdev(struct virtio_bluetooth *vbt) { + unsigned long flags; int i; =20 - cancel_work_sync(&vbt->rx); + spin_lock_irqsave(&vbt->rx_lock, flags); + vbt->stopped =3D true; + virtqueue_disable_cb(vbt->vqs[VIRTBT_VQ_RX]); + spin_unlock_irqrestore(&vbt->rx_lock, flags); + + cancel_work_sync(&vbt->rx_refill); =20 for (i =3D 0; i < ARRAY_SIZE(vbt->vqs); i++) { struct virtqueue *vq =3D vbt->vqs[i]; @@ -83,6 +114,10 @@ static int virtbt_close_vdev(struct virtio_bluetooth *v= bt) cond_resched(); } =20 + spin_lock_irqsave(&vbt->rx_lock, flags); + vbt->rx_buf_count =3D 0; + spin_unlock_irqrestore(&vbt->rx_lock, flags); + return 0; } =20 @@ -234,31 +269,17 @@ static void virtbt_rx_handle(struct virtio_bluetooth = *vbt, struct sk_buff *skb) hci_recv_frame(vbt->hdev, skb); } =20 -static void virtbt_rx_work(struct work_struct *work) +static void virtbt_rx_refill_work(struct work_struct *work) { struct virtio_bluetooth *vbt =3D container_of(work, - struct virtio_bluetooth, rx); - struct sk_buff *skb; - unsigned int len; - - skb =3D virtqueue_get_buf(vbt->vqs[VIRTBT_VQ_RX], &len); - if (!skb) - return; - - if (!len || len > VIRTBT_RX_BUF_SIZE) { - bt_dev_err_ratelimited(vbt->hdev, - "rx reply len %u outside [1, %u]\n", - len, VIRTBT_RX_BUF_SIZE); - kfree_skb(skb); - } else { - skb_put(skb, len); - virtbt_rx_handle(vbt, skb); - } + struct virtio_bluetooth, rx_refill); + bool kick =3D false; =20 - if (virtbt_add_inbuf(vbt) < 0) - return; + while (!virtbt_add_inbuf(vbt, GFP_KERNEL)) + kick =3D true; =20 - virtqueue_kick(vbt->vqs[VIRTBT_VQ_RX]); + if (kick) + virtqueue_kick(vbt->vqs[VIRTBT_VQ_RX]); } =20 static void virtbt_tx_done(struct virtqueue *vq) @@ -273,8 +294,63 @@ static void virtbt_tx_done(struct virtqueue *vq) static void virtbt_rx_done(struct virtqueue *vq) { struct virtio_bluetooth *vbt =3D vq->vdev->priv; + bool cb_enabled =3D true; + bool kick =3D false; + + for (;;) { + struct sk_buff *skb; + unsigned int len; + unsigned long flags; + + spin_lock_irqsave(&vbt->rx_lock, flags); + if (vbt->stopped) { + spin_unlock_irqrestore(&vbt->rx_lock, flags); + return; + } + + if (cb_enabled) { + virtqueue_disable_cb(vq); + cb_enabled =3D false; + } + + skb =3D virtqueue_get_buf(vq, &len); + if (skb) + vbt->rx_buf_count--; + + if (!skb) { + if (kick) { + spin_unlock_irqrestore(&vbt->rx_lock, flags); + kick =3D false; + virtqueue_kick(vq); + continue; + } + + if (virtqueue_enable_cb(vq)) { + spin_unlock_irqrestore(&vbt->rx_lock, flags); + return; + } + cb_enabled =3D true; + } + spin_unlock_irqrestore(&vbt->rx_lock, flags); =20 - schedule_work(&vbt->rx); + if (!skb) + continue; + + if (!len || len > VIRTBT_RX_BUF_SIZE) { + bt_dev_err_ratelimited(vbt->hdev, + "rx reply len %u outside [1, %u]\n", + len, VIRTBT_RX_BUF_SIZE); + kfree_skb(skb); + } else { + skb_put(skb, len); + virtbt_rx_handle(vbt, skb); + } + + if (virtbt_add_inbuf(vbt, GFP_ATOMIC) < 0) + schedule_work(&vbt->rx_refill); + else + kick =3D true; + } } =20 static int virtbt_probe(struct virtio_device *vdev) @@ -307,7 +383,8 @@ static int virtbt_probe(struct virtio_device *vdev) vdev->priv =3D vbt; vbt->vdev =3D vdev; =20 - INIT_WORK(&vbt->rx, virtbt_rx_work); + INIT_WORK(&vbt->rx_refill, virtbt_rx_refill_work); + spin_lock_init(&vbt->rx_lock); =20 err =3D virtio_find_vqs(vdev, VIRTBT_NUM_VQS, vbt->vqs, vqs_info, NULL); if (err) --=20 2.53.0