Received: by 2002:a25:b794:0:0:0:0:0 with SMTP id n20csp4228019ybh; Tue, 6 Aug 2019 08:15:39 -0700 (PDT) X-Google-Smtp-Source: APXvYqz27DrjzbxzATsyN/OzvTKwyT7aYUwMtsBkT77L1Iz8TCLZYppMQ48IpEMcu7rYdKXE6lj+ X-Received: by 2002:a17:902:6a88:: with SMTP id n8mr3693028plk.70.1565104539409; Tue, 06 Aug 2019 08:15:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565104539; cv=none; d=google.com; s=arc-20160816; b=eSa6sgs31wWgrmZnCMkKswW2OeFAy19o5yAo9PV7W/WDtg0fIK0zrJeZxNdD0KZUGG AYDDdEu6gjGRwcyNP1o7BENBqhoehXwLUhvTpLbDBT3G2ZIHjwxa1CzZc3Wv/D1jpCEP +w+XCbMuz9Tra+UHmrNcMMFcLTPyqSYjDU6U1LK/1Y/1LsTIMHdZJg2weEmcbHLL/G8C topTgX99ytce9R/Vtln5q3j5R1USx5dfHR5o/mnNXTdwoCVqy3H3l3mZH4VcuuOA1SYN p1KMr7JWcY5oxyFaCuGmuCEF3NpSPLOKfch9REjWaImBWW/QPidTz3/tfDugzfF4IHoV EmaQ== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=uvgqJUZr8IXs17WjF00R3jSRk57EHrY5RNztuUkRI1Y=; b=pmojRCcEzB5bai1Vm68qDh1IdEJEObNd0vk2D8YabhE5YRe5YwnOSodJtIbgEIElis Hl4XAaWYkicdJBdMad5TG1Xxyusr9h02WZVnldz14hX0PehloJ83wdD9e9GbCvOtLvM8 qlbQNHTLQvMH4q9mlRskOUopgmiONKQC4IntlzmimHS9pPumcJw4vQW3DwljuPsxBTOH GLA1+MSc/7st+i2wmbpHEWE5wJ4vGQw2+aAretR1RYIWrSnfUQTi32eYFOrEBKpiFYsf 5sKe2sT4jbo39JxsVWsmhzsgU/I1VN0GRgRY1lwHgeF3ANE4VeQby2VnlmezkOGwhWsU wS7A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=XwSgNMoR; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z197si45929537pgz.267.2019.08.06.08.15.23; Tue, 06 Aug 2019 08:15:39 -0700 (PDT) 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 header.i=@kernel.org header.s=default header.b=XwSgNMoR; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732836AbfHFPN5 (ORCPT + 99 others); Tue, 6 Aug 2019 11:13:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:57752 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726877AbfHFPN5 (ORCPT ); Tue, 6 Aug 2019 11:13:57 -0400 Received: from [192.168.1.112] (c-24-9-64-241.hsd1.co.comcast.net [24.9.64.241]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7FBDF216B7; Tue, 6 Aug 2019 15:13:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1565104436; bh=o7Iw858NsCabZtAX4JUiHaN3QVGg5unNWOAa7BMBif8=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=XwSgNMoRE+No0JgezETKcY/oiHEQlOX5Nyc9inInecAShqM3EckNxxCK9abnU91kx 6PBmidIqcQAdYZUCRULxkmFQETfzQdm+fPKp67XkG6NT71hmKmZoZUG8RoJ3dCisvc fjRRH10Bfw2uHkQTFNqxP0SaNltPwUTPO+tE4wcA= Subject: Re: [PATCH v4 2/2] usbip: Implement SG support to vhci-hcd and stub driver To: Suwan Kim , valentina.manea.m@gmail.com, gregkh@linuxfoundation.org, stern@rowland.harvard.edu Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, shuah References: <20190806123154.23798-1-suwan.kim027@gmail.com> <20190806123154.23798-3-suwan.kim027@gmail.com> From: shuah Message-ID: Date: Tue, 6 Aug 2019 09:13:54 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <20190806123154.23798-3-suwan.kim027@gmail.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 8/6/19 6:31 AM, Suwan Kim wrote: > There are bugs on vhci with usb 3.0 storage device. In USB, each SG > list entry buffer should be divisible by the bulk max packet size. > But with native SG support, this problem doesn't matter because the > SG buffer is treated as contiguous buffer. But without native SG > support, USB storage driver breaks SG list into several URBs and the > error occurs because of a buffer size of URB that cannot be divided > by the bulk max packet size. The error situation is as follows. > > When USB Storage driver requests 31.5 KB data and has SG list which > has 3584 bytes buffer followed by 7 4096 bytes buffer for some > reason. USB Storage driver splits this SG list into several URBs > because VHCI doesn't support SG and sends them separately. So the > first URB buffer size is 3584 bytes. When receiving data from device, > USB 3.0 device sends data packet of 1024 bytes size because the max > packet size of BULK pipe is 1024 bytes. So device sends 4096 bytes. > But the first URB buffer has only 3584 bytes buffer size. So host > controller terminates the transfer even though there is more data to > receive. So, vhci needs to support SG transfer to prevent this error. > > In this patch, vhci supports SG regardless of whether the server's > host controller supports SG or not, because stub driver splits SG > list into several URBs if the server's host controller doesn't > support SG. > > To support SG, vhci_map_urb_for_dma() sets URB_DMA_MAP_SG flag in > urb->transfer_flags if URB has SG list and this flag will tell stub > driver to use SG list. > > vhci sends each SG list entry to stub driver. Then, stub driver sees > the total length of the buffer and allocates SG table and pages > according to the total buffer length calling sgl_alloc(). After stub > driver receives completed URB, it again sends each SG list entry to > vhci. > > If the server's host controller doesn't support SG, stub driver > breaks a single SG request into several URBs and submits them to > the server's host controller. When all the split URBs are completed, > stub driver reassembles the URBs into a single return command and > sends it to vhci. > > Moreover, in the situation where vhci supports SG, but stub driver > does not, or vice versa, usbip works normally. Because there is no > protocol modification, there is no problem in communication between > server and client even if the one has a kernel without SG support. > > In the case of vhci supports SG and stub driver doesn't, because > vhci sends only the total length of the buffer to stub driver as > it did before the patch applied, stub driver only needs to allocate > the required length of buffers regardless of whether vhci supports > SG or not. > > If stub driver needs to send data buffer to vhci because of IN pipe, > stub driver also sends only total length of buffer as metadata and > then sends real data as vhci does. Then vhci receive data from stub > driver and store it to the corresponding buffer of SG list entry. > > In the case of stub driver that supports SG, buffer is allocated by > sgl_alloc(). However, stub driver that does not support SG allocates > buffer using only kmalloc(). Therefore, if vhci supports SG and stub > driver doesn't, stub driver has to allocate buffer with kmalloc() as > much as the total length of SG buffer which is quite huge when vhci > sends SG request, so it has big overhead in buffer allocation. > > And for the case of stub driver supports SG and vhci doesn't, since > the USB storage driver checks that vhci doesn't support SG and sends > the request to stub driver by splitting the SG list into multiple > URBs, stub driver allocates a buffer with kmalloc() as it did before > this patch. > > VUDC also works well with this patch. Tests are done with two USB > gadget created by CONFIGFS USB gadget. Both use the BULK pipe. > > 1. Serial gadget > 2. Mass storage gadget > > * Serial gadget test > > Serial gadget on the host sends and receives data using cat command > on the /dev/ttyGS. The client uses minicom to communicate with > the serial gadget. > > * Mass storage gadget test > > After connecting the gadget with vhci, use "dd" to test read and > write operation on the client side. > > Read - dd if=/dev/sd iflag=direct of=/dev/null bs=1G count=1 > Write - dd if= iflag=direct of=/dev/sd bs=1G count=1 > Thanks for the test results. Were you able to test with USB lowspeed devices? thanks, -- Shuah