Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2704162imu; Sun, 6 Jan 2019 08:03:58 -0800 (PST) X-Google-Smtp-Source: ALg8bN6eGFPeX40at4EhgYUIGY4xvVnrXbiZeZxtqY5hNaNUFUQTtiJ7+WxTcTVXkFDXnC13II+c X-Received: by 2002:a17:902:9045:: with SMTP id w5mr55696708plz.32.1546790638240; Sun, 06 Jan 2019 08:03:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1546790638; cv=none; d=google.com; s=arc-20160816; b=k7JrffoQxSaejy4rUjly1jus6ECrkhq8nQUdzISsoPPLHRNi6F6HrHbojn2FHlxGNz XXqZvTgF4VOOLsPyqQQf237l/DCkzEBBrePqwRPda80rNm7up3S2CzSFDhShSLV9WV7U RgxE7VC3pRiBVRgxCXVTDv/p5Aio8ivoInPy9C4sZemxLAX5/79l/rQrv35d9zL+NEQY yHLam4MJJL2KGJRLYUg5TwaLvhiVQRfF0go7TnRTb88sVdeyac/GQV9Q7g/taEf1TcLb FkpXdzTvB/YlM7YrJXE0tIa81AygNkrfpUXdCGRwXjGP6lhmDsKUUI6YMFCfKBk04lOp QX8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=h1hcvW3YvFlITFWSg3aNJfck7uaX46HxWWQKJzfIzYA=; b=wpEqdQjSog98mEiUJZorveuTjNVrijADKqPxdLbIxh8U9u75Br9dica2+xNKvMnJPx +/a+ItaK66J3YsuupqQwBWj68QBOfLqXys7OU0hm6x0QgEF7LvfUKY9VxNtSW41fSyWb L42PW421QzYD3ERuqGSCQkctlHWd0vq93GQM46GEA85I+/UxDUiIy13CxkAbfFUQgKs8 J6zsA5PDAdQ9s4G2B30ThcF+YRZwz8kpwKEXmKQV2rRiGiIFtid1R+VCszQnRkFuleae yXwlI8U4tGGJyrxc6QzoqhPBirRcQ7Fr2HKNNtxxXpFfgvEs5OkgFLFXA7miAsx0GLKa rynQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=bqrP4JRW; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b65si59111492pgc.259.2019.01.06.08.03.42; Sun, 06 Jan 2019 08:03:58 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=bqrP4JRW; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726421AbfAFQCd (ORCPT + 99 others); Sun, 6 Jan 2019 11:02:33 -0500 Received: from perceval.ideasonboard.com ([213.167.242.64]:54832 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726341AbfAFQCd (ORCPT ); Sun, 6 Jan 2019 11:02:33 -0500 Received: from localhost.localdomain (unknown [96.44.9.229]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id EDF8198C; Sun, 6 Jan 2019 17:02:28 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1546790551; bh=RXeoIlbfHWyvwrcg7GnA48vy6AaONClWFffKnMvtbxk=; h=From:To:Cc:Subject:Date:From; b=bqrP4JRWoVwQ5+esXHzU35Gee6uph3CGI7GTzoEH6MZFybcNpbUTVPTjrDnUPQ0Mo eVjr6Ga8CR1UI0SqngFl6WbqMcJGawPVdFWyjhnFtCkx8pkUzwJAVqMYlR4RCA7jpo DgBxDT9PITYeUQDvebg9+mxmrQkiZjX6dJDFLVYQ= From: Paul Elder To: laurent.pinchart@ideasonboard.com, kieran.bingham@ideasonboard.com Cc: Paul Elder , b-liu@ti.com, stern@rowland.harvard.edu, rogerq@ti.com, balbi@kernel.org, gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 0/6] usb: gadget: add mechanism to asynchronously validate data stage of ctrl out request Date: Sun, 6 Jan 2019 11:02:15 -0500 Message-Id: <20190106160221.4480-1-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch series adds a mechanism to allow asynchronously validating the data stage of a control OUT request, and for stalling or suceeding the request accordingly. This mechanism is implemented for MUSB, and is used by UVC. At the same time, UVC packages the setup stage and data stage data together to send to userspace to save on a pair of context switches per control out request. This patch series does change the userspace API. We however believe that it is justified because the current API is broken, and because it isn't being used (because it's broken). The current API is broken such that it is subject to race conditions that cause fatal errors with a high frequency. This is actually what motivated this patch series in the first place. In the current API, not only is there no way to asynchronously validate the data stage of a control OUT request, but an empty buffer is expected to be provided to hold the data stage data -- which is more likely than not to be late. There is even a warning in musb_g_ep0_queue: /* else for sequence #2 (OUT), caller provides a buffer * before the next packet arrives. deferred responses * (after SETUP is acked) are racey. */ This problem has never been reported in years, which is a sign that the API isn't used. Furthermore, the vendor kernels that we have seen using the UVC gadget driver (such as QC and Huawei) are heavily patched with local changes to the API. This corroborates the suspicion that the current mainline API is not being used. Additionally, this API isn't meant to be used by generic applications, but by a dedicated userspace helper. uvc-gadget is one such example, but it has bitrotten and isn't compatible with the current kernel API. The fact that nobody has submitted patches nor complained for a long time again shows that it isn't being used. The conclusion is that since the API hasn't been used for a long time, it is safe to fix it. Changes in v4: - Change wording and fix typo in patch 4/6 "usb: gadget: add mechanism to specify an explicit status stage" - Set explicit_status in usb_gadget_control_complete - Change explicit_status from unsigned int to bool Changes in v3: - Function driver send STALL status stage by simply calling usb_ep_set_halt, and ACK by enqueueing request - Fix signature of usb_gadget_control_complete to check the status of the request that was just given back. - Corresponding changes to musb and uvc gadget Changes in v2: Overhaul of status stage delay mechanism/API. Now if a function driver desires an explicit/delayed status stage, it specifies so in a flag in the usb_request that is queued for the data stage. The function driver later enqueues another usb_request for the status stage, also with the explicit_status flag set, and with the zero flag acting as the status. If a function driver does not desire an explicit status stage, then it can set (or ignore) the explicit_status flag in the usb_request that is queued for the data stage. To allow the optional explicit status stage, a UDC driver should call the newly added usb_gadget_control_complete right after usb_gadget_giveback_request, and in its queue function should check if the usb_request is for the status stage and if it has been requested to be explicit, and if so check the status that should be sent. (See 5/6 "usb: musb: gadget: implement optional explicit status stage" for an implementation for MUSB) Paul Elder (6): usb: uvc: include videodev2.h in g_uvc.h usb: gadget: uvc: enqueue usb request in setup handler for control OUT usb: gadget: uvc: package setup and data for control OUT requests usb: gadget: add mechanism to specify an explicit status stage usb: musb: gadget: implement optional explicit status stage usb: gadget: uvc: allow ioctl to send response in status stage drivers/usb/gadget/function/f_uvc.c | 32 ++++++++++++++++++------ drivers/usb/gadget/function/uvc.h | 1 + drivers/usb/gadget/function/uvc_v4l2.c | 18 ++++++++++++++ drivers/usb/gadget/udc/core.c | 34 ++++++++++++++++++++++++++ drivers/usb/musb/musb_gadget.c | 2 ++ drivers/usb/musb/musb_gadget_ep0.c | 23 +++++++++++++++++ include/linux/usb/gadget.h | 10 ++++++++ include/uapi/linux/usb/g_uvc.h | 4 ++- 8 files changed, 115 insertions(+), 9 deletions(-) -- 2.19.2 Paul Elder (6): usb: uvc: include videodev2.h in g_uvc.h usb: gadget: uvc: enqueue usb request in setup handler for control OUT usb: gadget: uvc: package setup and data for control OUT requests usb: gadget: add mechanism to specify an explicit status stage usb: musb: gadget: implement optional explicit status stage usb: gadget: uvc: allow ioctl to send response in status stage drivers/usb/gadget/function/f_uvc.c | 32 ++++++++++++++++++------ drivers/usb/gadget/function/uvc.h | 1 + drivers/usb/gadget/function/uvc_v4l2.c | 18 ++++++++++++++ drivers/usb/gadget/udc/core.c | 34 ++++++++++++++++++++++++++ drivers/usb/musb/musb_gadget.c | 2 ++ drivers/usb/musb/musb_gadget_ep0.c | 23 +++++++++++++++++ include/linux/usb/gadget.h | 10 ++++++++ include/uapi/linux/usb/g_uvc.h | 4 ++- 8 files changed, 115 insertions(+), 9 deletions(-) -- 2.19.2