Received: by 2002:a05:6358:f14:b0:e5:3b68:ec04 with SMTP id b20csp6240386rwj; Wed, 21 Dec 2022 12:40:47 -0800 (PST) X-Google-Smtp-Source: AMrXdXtrtGeAFXEqp3+AMEJ89ZPgoWbCBhD6VRZ52y0zijeUnvtGJ/fj5vgiVj6MJSeAK73dd9pP X-Received: by 2002:a17:907:7e83:b0:7c0:e6d8:7770 with SMTP id qb3-20020a1709077e8300b007c0e6d87770mr2945359ejc.74.1671655247314; Wed, 21 Dec 2022 12:40:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671655247; cv=none; d=google.com; s=arc-20160816; b=LzbG43dxAdGEXL+zVc/svOZjjsmHpCnWBhX7CofETZJHtm9psfuYCrd3C+8o0brhQf IWx1KvbklKgb0w/Ukaco/0UH7DZ9ajc2tZ678KTlgJWxAtJ60/JksnUlvhPPVUOwea3z dAGmq+nWWqRm3Y77+6/CAh51BC0dBy1qLVWOZAD7m1V4qqSBL+NWOcBzEcTgRkW23wVb +u6vYyFoTKx18gH1LC0HXcM5k5+Lj4zV5BsCtS/Yk/iCSyP06dgEXs801LroZM9NT5bQ Ld5wy1ovVcleutZ0VvSP68+oggVdDJ9rb+smly5BJPEUI4Ub8KAEK7Cwk7kfwGMrjXJa fvtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=APRZauA4anIzv3iV33t83dBYAS4rzUEffqaUdknM5sk=; b=Rj3sbAsCvz3OD5AAvjK6gp7enWwVHzYujS2qF/uPJOPV98NR6LQNgj718bA4mHrowc usT9IyhWs3PddnCBiCyTGRakEh7dxxZR+5sMRgjp6k7sC3rujbL+La4dW1oIMZzXgB/s VZW9PHI7qYcux33kXaXkrX5Ggxcly+jDAK62BNc/ZqfcQrx4Qh6D9nNcDBO9wFsrwOm9 MgMmW/bBl3I29aIVdRDtAWom2cpVyKolEz+B1LfkKRP6dHdlbILp//oeA0qvwdsGbsAr TcVHkX1hXFltIudponwRjBVhZlYYO8IrcPk5Q4fL5lBwTAZ/w8zsUSRN4/yNhAmkVLCL w2Vw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b22-20020a1709062b5600b007c18e8131e1si13135579ejg.744.2022.12.21.12.40.30; Wed, 21 Dec 2022 12:40:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229789AbiLUU0K (ORCPT + 68 others); Wed, 21 Dec 2022 15:26:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229491AbiLUU0H (ORCPT ); Wed, 21 Dec 2022 15:26:07 -0500 Received: from netrider.rowland.org (netrider.rowland.org [192.131.102.5]) by lindbergh.monkeyblade.net (Postfix) with SMTP id 4FC7E24F0A for ; Wed, 21 Dec 2022 12:26:02 -0800 (PST) Received: (qmail 100032 invoked by uid 1000); 21 Dec 2022 15:26:01 -0500 Date: Wed, 21 Dec 2022 15:26:01 -0500 From: Alan Stern To: Ricardo Ribalda Cc: Bagas Sanjaya , Laurent Pinchart , Christoph Hellwig , Greg Kroah-Hartman , Randy Dunlap , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v3] USB: Improve usb_fill_* documentation Message-ID: References: <20221220-usb-dmadoc-v3-0-6009f4d27631@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,SPF_HELO_PASS,SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Dec 21, 2022 at 08:34:42PM +0100, Ricardo Ribalda wrote: > Hi Alan > > On Wed, 21 Dec 2022 at 18:28, Alan Stern wrote: > > > > On Wed, Dec 21, 2022 at 11:15:14AM +0100, Ricardo Ribalda wrote: > > > Document the transfer buffer requirement. That is, the buffer must be > > > DMAble - otherwise data corruption might occur. > > > > > > Acked-by: Randy Dunlap > > > Signed-off-by: Ricardo Ribalda > > > --- > > > USB: Improve usb_fill_* documentation > > > > > > After trying to "cleanup" the uvc code, I was patiently explained about > > > the requirements of the urb transfer buffers. > > > > > > Lets make this explicit, so other developers do not make the same mistake. > > > > > > To: Bagas Sanjaya > > > To: Randy Dunlap > > > To: Alan Stern > > > To: Christoph Hellwig > > > To: Laurent Pinchart > > > To: Greg Kroah-Hartman > > > Cc: linux-usb@vger.kernel.org > > > Cc: linux-kernel@vger.kernel.org > > > --- > > > Changes in v3: > > > - Improve commit message. Thanks Bagas! > > > - Improve field description. Thanks Alan! > > > - Link to v2: https://lore.kernel.org/r/20221220-usb-dmadoc-v2-0-4dd4f198113e@chromium.org > > > > > > Changes in v2: > > > - s/allocatiing/allocating/ Thanks Randy > > > - Link to v1: https://lore.kernel.org/r/20221220-usb-dmadoc-v1-0-28386d2eb6cd@chromium.org > > > --- > > > include/linux/usb.h | 27 +++++++++++++++++++++++---- > > > 1 file changed, 23 insertions(+), 4 deletions(-) > > > > > > diff --git a/include/linux/usb.h b/include/linux/usb.h > > > index 7d5325d47c45..06cde9ddca97 100644 > > > --- a/include/linux/usb.h > > > +++ b/include/linux/usb.h > > > @@ -1626,14 +1626,25 @@ struct urb { > > > * @urb: pointer to the urb to initialize. > > > * @dev: pointer to the struct usb_device for this urb. > > > * @pipe: the endpoint pipe > > > - * @setup_packet: pointer to the setup_packet buffer > > > - * @transfer_buffer: pointer to the transfer buffer > > > + * @setup_packet: pointer to the setup_packet buffer. The buffer must be > > > + * suitable for DMA. > > > + * @transfer_buffer: pointer to the transfer buffer. The buffer must be > > > + * suitable for DMA. > > > * @buffer_length: length of the transfer buffer > > > * @complete_fn: pointer to the usb_complete_t function > > > * @context: what to set the urb context to. > > > * > > > * Initializes a control urb with the proper information needed to submit > > > * it to a device. > > > + * > > > + * The transfer buffer and the setup_packet buffer will most likely be filled > > > + * via DMA. > > > > No, no! The setup_packet buffer will never be filled via DMA -- it is > > _read_ via DMA. > > > > The transfer buffer may be filled via DMA; it depends on the direction > > of the transfer. For OUT transfers, the buffer is read via DMA; for IN > > transfers it is filled via DMA. > > I tried to have a short sentence :), but you are right, let's make it > explicit, at the end of the day that is the whole purpose of this > patch :) > > I have written now: will most likely be filled or read via DMA. Okay. > > > The simplest way to get a buffer that can be DMAed to is > > > + * allocating it via kmalloc() or equivalent, even for very small buffers. > > > + * If the buffers are embedded in a bigger structure, there is a risk that > > > + * the buffer itself, the previous field and/or the next field are corrupted > > > + * due to cache incoherencies; or slowed down if they are evicted from the > > > + * cache. > > > + * > > > */ > > > static inline void usb_fill_control_urb(struct urb *urb, > > > struct usb_device *dev, > > > @@ -1658,13 +1669,17 @@ static inline void usb_fill_control_urb(struct urb *urb, > > > * @urb: pointer to the urb to initialize. > > > * @dev: pointer to the struct usb_device for this urb. > > > * @pipe: the endpoint pipe > > > - * @transfer_buffer: pointer to the transfer buffer > > > + * @transfer_buffer: pointer to the transfer buffer. The buffer must be > > > + * suitable for DMA. > > > * @buffer_length: length of the transfer buffer > > > * @complete_fn: pointer to the usb_complete_t function > > > * @context: what to set the urb context to. > > > * > > > * Initializes a bulk urb with the proper information needed to submit it > > > * to a device. > > > + * > > > + * Please refer to usb_fill_control_urb() for a description of the > > > + * requirements for transfer_buffer. > > > > _This_ right here is the kerneldoc for usb_fill_control_urb()! You > > should have written "Please refer to the kerneldoc for struct urb". > > > > Please try applying the patch. I believe it is on the right location. > diff does not know about kerneldoc and this is why it copies the > previous header (struct urb), instead of usb_fill_control_urb. > > This is why it seems that all the messages are shifted one location up. You're right; sorry for jumping to unwarranted conclusions. > I would also prefer to keep the: refer to usb_fill_control_urb, as the > functions are more indexed than the structures: Eg: > https://manpages.debian.org/testing/linux-manual-4.8/usb_fill_control_urb.9.en.html > > What about adding a reference to struct urb at usb_fill_control_urb() ? That's a good idea. Alan Stern