Received: by 2002:a05:7412:37c9:b0:e2:908c:2ebd with SMTP id jz9csp1553284rdb; Wed, 20 Sep 2023 12:23:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHSG7bOZkF47ZK8YjdLCCQzpuov+7w6Lcg/UMHD9wAxudJUmXpfBanMNo2YFzV4H2G0oJwS X-Received: by 2002:a17:90b:1190:b0:274:7b6a:4358 with SMTP id gk16-20020a17090b119000b002747b6a4358mr3480584pjb.6.1695237801290; Wed, 20 Sep 2023 12:23:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695237801; cv=none; d=google.com; s=arc-20160816; b=ZNpn33niLRvzPWftU5uKITywRtFJvCuC1XVA6zYpn6vMNR1pF4x09VMLN6uQEgrQGJ p8J9s7Vft7T2xyHCmWtEV+PntcXX4iAg8jpMLEAC56751hnIQw+xnUGSKQB0lbYBRfIy PmzUedV55MBczx126kWV5ZkmgcJnLM5PS0flYarjo3H5y4VnV4I4XcQQTntejhs+JkxD KQWBypD/t1LDpvZymERFWCOnI1wtKZTAvY5Lwd77EmpTb3U0nKhoR32IxI81GffrqadU e1BW0+5krjnaag5SyuNTorXWZPs9bXqz+cTSbX6vYKrZDgjT84G2ED9xZJ9fGaWXZy91 donQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=h0ZtUkIzL6VM4Pr2bbpmuE9HP/S5mY9CGF7+uDlu3M4=; fh=cDb+OBRfnjRhAYAfA7aQFYWAFNWpmB7foPz5Xhgj4Gc=; b=y5CJHkUDmpaL5te2a2guzpGWI11m7XoPfQha5dKIWWraeh85PCS4Spp4wXAWixDBAr rYXM+B4iEEWqSF2JgPhbTHoZTQmz8R/xQTCXcSxCUEkmUyW5ubBUIAFVVPA+03R8YBSa ylf7Lfq7eHMzdckdnIMhTfPyDTYfKu/32f0RabdSrr2n9s5gFJuGoipaextdM7dOBoew 0hwc3XoMGtJmZEf6kweBJm12QcNclQu7iByvCK4pq9LdLxGF9gyglESHbK+wrhbK8w3m 6jtfJHse2P779cjfS2+fzzRMaFv8nr5H8K7NLHAeLQxJ+KH7U1F5FS4KD+f59EKPop+L Mnsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b="mgdO/AIp"; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id i12-20020a17090adc0c00b002532c9b252asi2115222pjv.73.2023.09.20.12.23.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Sep 2023 12:23:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b="mgdO/AIp"; spf=pass (google.com: domain of linux-bluetooth-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id 2EEEB819D723; Wed, 20 Sep 2023 08:31:47 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235301AbjITPbu (ORCPT + 99 others); Wed, 20 Sep 2023 11:31:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40678 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235157AbjITPbu (ORCPT ); Wed, 20 Sep 2023 11:31:50 -0400 Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 925C58F for ; Wed, 20 Sep 2023 08:31:39 -0700 (PDT) Received: by mail-wm1-x32d.google.com with SMTP id 5b1f17b1804b1-4018af103bcso7674745e9.1 for ; Wed, 20 Sep 2023 08:31:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695223893; x=1695828693; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=h0ZtUkIzL6VM4Pr2bbpmuE9HP/S5mY9CGF7+uDlu3M4=; b=mgdO/AIppPt40ybQggd0gSRywiNE0EcLpQqs40iGc9bQ5sZ1H5nmH4qRDvefvuyC7o S6IF/HZ18PVpF1IISDpH71LBtA+Jcd2FQ7zUdGvf6/byUBSOEHQk1jwMQz6UXOZzMNm1 Ln0GveIq9WQc/xWeULHK1s5WZDZem6YVLW3LZ6awXCcYxO9LO2JBXWy7BZ+4zqt0l13L clYeOFeLkQOzbKAVeQUfCpCo5IvS1yGbpxwGJnWaoBspT5sI4jBG2uEEWPMUg15p8xx+ huvtTLBqvy8FiLhG02xo1DvviBAiumIPmGVfvTv6yB/KClueahwW+C7UHiPbyCOeUA0U 2Ktw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695223893; x=1695828693; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=h0ZtUkIzL6VM4Pr2bbpmuE9HP/S5mY9CGF7+uDlu3M4=; b=A+UUVPTo91W2j/Hz6Lu37uu4/CqzpzPL3wi2YRL/roO7U7OzQcEhiIDFgSXrJX1Ajg +VZ0CKh8JskzUKpGL2vwQ3LDhcF6Lnw8m+gEBa9uJLsIEqthZ1b6c5WOkw8W0JAM37o/ JxGxtgPyjOrtOtS+yUi1QEeDYzzs2LFWkz6lQ4vXC72Dtr2nYrKOaOTzw0moT7k1bx1q r1Ukrv1wTwsiXI8x80eADAotcxHqqHEL2ZJFYYUp6l1UxLB3oninV4hAAvJQ25MlVtQN uSGtr8jWWAX6OenmxFKMCEyPz/hHCT0QOPLqlLrCatusXwl/9OFE3kC51ZfNIgeWS2wU irUQ== X-Gm-Message-State: AOJu0YzpBRpVBej52nc0HPgCx1Xd7YZA/lj9Avypfy9kwZtPohAUR7B6 T/sHf1iU9086cMAD7wXF8+DMQzZOfiE= X-Received: by 2002:a05:600c:328a:b0:402:b8:d022 with SMTP id t10-20020a05600c328a00b0040200b8d022mr4636450wmp.16.1695223892620; Wed, 20 Sep 2023 08:31:32 -0700 (PDT) Received: from localhost.localdomain (46.205.192.105.nat.ftth.dynamic.t-mobile.pl. [46.205.192.105]) by smtp.gmail.com with ESMTPSA id k22-20020a05600c0b5600b003fe601a7d46sm2268133wmr.45.2023.09.20.08.30.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Sep 2023 08:31:07 -0700 (PDT) From: Arkadiusz Bokowy To: linux-bluetooth@vger.kernel.org Cc: Arkadiusz Bokowy Subject: [PATCH] Bluetooth: vhci: Fix race when opening vhci device Date: Wed, 20 Sep 2023 17:30:07 +0200 Message-Id: <20230920153008.967330-1-arkadiusz.bokowy@gmail.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Wed, 20 Sep 2023 08:31:47 -0700 (PDT) When the vhci device is opened in the two-step way, i.e.: open device then write a vendor packet with requested controller type, the device shall respond with a vendor packet which includes HCI index of created interface. When the virtual HCI is created, the host sends a reset request to the controller. This request is processed by the vhci_send_frame() function. However, this request is send by a different thread, so it might happen that this HCI request will be received before the vendor response is queued in the read queue. This results in the HCI vendor response and HCI reset request inversion in the read queue which leads to improper behavior of btvirt: > dmesg [1754256.640122] Bluetooth: MGMT ver 1.22 [1754263.023806] Bluetooth: MGMT ver 1.22 [1754265.043775] Bluetooth: hci1: Opcode 0x c03 failed: -110 In order to synchronize vhci two-step open/setup process with virtual HCI initialization, this patch adds internal lock when queuing data in the vhci_send_frame() function. Signed-off-by: Arkadiusz Bokowy --- drivers/bluetooth/hci_vhci.c | 3 +++ net/bluetooth/hci_sync.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index 40e2b9fa11a2..f3892e9ce800 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c @@ -74,7 +74,10 @@ static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) struct vhci_data *data = hci_get_drvdata(hdev); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1); + + mutex_lock(&data->open_mutex); skb_queue_tail(&data->readq, skb); + mutex_unlock(&data->open_mutex); wake_up_interruptible(&data->read_wait); return 0; diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c index 3640d73f9595..2a7d432436a2 100644 --- a/net/bluetooth/hci_sync.c +++ b/net/bluetooth/hci_sync.c @@ -152,7 +152,7 @@ struct sk_buff *__hci_cmd_sync_sk(struct hci_dev *hdev, u16 opcode, u32 plen, struct sk_buff *skb; int err = 0; - bt_dev_dbg(hdev, "Opcode 0x%4x", opcode); + bt_dev_dbg(hdev, "Opcode 0x%4.4x", opcode); hci_req_init(&req, hdev); @@ -248,7 +248,7 @@ int __hci_cmd_sync_status_sk(struct hci_dev *hdev, u16 opcode, u32 plen, skb = __hci_cmd_sync_sk(hdev, opcode, plen, param, event, timeout, sk); if (IS_ERR(skb)) { if (!event) - bt_dev_err(hdev, "Opcode 0x%4x failed: %ld", opcode, + bt_dev_err(hdev, "Opcode 0x%4.4x failed: %ld", opcode, PTR_ERR(skb)); return PTR_ERR(skb); } -- 2.34.1