linux-usb.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tejas Joglekar <Tejas.Joglekar@synopsys.com>
To: Mathias Nyman <mathias.nyman@linux.intel.com>,
	Tejas Joglekar <Tejas.Joglekar@synopsys.com>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
	Mathias Nyman <mathias.nyman@intel.com>
Cc: John Youn <John.Youn@synopsys.com>
Subject: Re: [RFC PATCH 1/4] usb: xhci: Synopsys xHC consolidate TRBs
Date: Fri, 7 Feb 2020 17:17:44 +0000	[thread overview]
Message-ID: <7d042091-66b5-c245-73c8-f4491ea037c3@synopsys.com> (raw)
In-Reply-To: <3b09e3ef-d322-f8c8-f00a-34341509c350@linux.intel.com>

Hi,
Thanks for the review comments.
On 1/3/2020 10:14 PM, Mathias Nyman wrote:
> On 20.12.2019 15.39, Tejas Joglekar wrote:
>> The Synopsys xHC has an internal TRB cache of size TRB_CACHE_SIZE for
>> each endpoint. The default value for TRB_CACHE_SIZE is 16 for SS and 8
>> for HS. The controller loads and updates the TRB cache from the transfer
>> ring in system memory whenever the driver issues a start transfer or
>> update transfer command.
>>
>> For chained TRBs, the Synopsys xHC requires that the total amount of
>> bytes for all TRBs loaded in the TRB cache be greater than or equal to 1
>> MPS. Or the chain ends within the TRB cache (with a last TRB).
>>
>> If this requirement is not met, the controller will not be able to send
>> or receive a packet and it will hang causing a driver timeout and error.
>>
>> This can be a problem if a class driver queues SG requests with many
>> small-buffer entries. The XHCI driver will create a chained TRB for each
>> entry which may trigger this issue.
>>
>> This patch adds logic to the XHCI driver to detect and prevent this from
>> happening.
>>
>> For every (TRB_CACHE_SIZE - 2) TRBs, we check the total buffer size of
>> the TRBs and if the chain continues and we don't make up at least 1 MPS,
>> we create a bounce buffer to consolidate up to the next (4 * MPS) TRBs
>> into the last TRB.
>>
>> We check at (TRB_CACHE_SIZE - 2) because it is possible that there would
>> be a link and/or event data TRB that take up to 2 of the cache entries.
>> And we consolidate the next (4 * MPS) to improve performance.
>>
>> We discovered this issue with devices on other platforms but have not
>> yet come across any device that triggers this on Linux. But it could be
>> a real problem now or in the future. All it takes is N number of small
>> chained TRBs. And other instances of the Synopsys IP may have smaller
>> values for the TRB_CACHE_SIZE which would exacerbate the problem.
>>
>> We verified this patch using our internal driver and testing framework.
> 
> If I understand the problem correctly you need to make sure the data pointed
> to by 16 (SS) or 8 (HS) chained TRBs must be equal to, or more than max packet size.
> 
> So in theory this should only be a problem for scatter gather buffers, right?
> 
Yes, this problem could be seen only with scatter gather buffers.

> This should already be handled by usb core unless no_sg_constraint flag is set,
> usb core it makes sure each sg list entry length is max packet size divisible, also
> meaning it needs to be at least max packet size. (or 0, but not an issue here)
> 
> see include/linux/usb.h: struct urb
>  
> * @sg: scatter gather buffer list, the buffer size of each element in
> *      the list (except the last) must be divisible by the endpoint's
> *      max packet size if no_sg_constraint isn't set in 'struct usb_bus'"
> 
> which is checked in drivers/usb/core/urb.c: usb_submit_urb()
> 
> for_each_sg(urb->sg, sg, urb->num_sgs - 1, i)
>     if (sg->length % max)
>         return -EINVAL;
> 
> So it seems all you need to do it make sure that the no_sg_constraint isn't set
> for this host controller vendor.
>
My understanding is if we don't set the no_sg_constraint and sg list entry is less
than max packet then transfer would not happen with the host controller. But the 
host controller supports all lengths of SG entries even less than MPS, only thing 
is the TRB_CACHE in the controller should have at least MPS size of data spread 
across it. So not setting up no_sg_constraint is not a useful solution. 
 
> This patch is too intrusive, its a very fine grained and complex solution to a
> vendor specific issue that has not caused any real life issues in Linux.
> It adds a new spinlock and list of bounce buffer to every transfer descriptor.
> 
I understand that in a first look it looks a complex solution, but you can suggest
the modifications/changes which would be required to make the patch more readable.
I have tried to keep the implementation similar to bounce buffer implementation 
only with addition of bounce buffer list. For the spinlock case, you can take a 
call if it is required or not.

> -Mathias
> 

Thanks & Regards,
Tejas Joglekar

  reply	other threads:[~2020-02-07 17:18 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-20 13:38 [RFC PATCH 0/4] Add logic to consolidate TRBs for Synopsys xHC Tejas Joglekar
2019-12-20 13:39 ` [RFC PATCH 1/4] usb: xhci: Synopsys xHC consolidate TRBs Tejas Joglekar
2020-01-02  9:08   ` David Laight
2020-01-03 16:44   ` Mathias Nyman
2020-02-07 17:17     ` Tejas Joglekar [this message]
2020-02-12 15:04       ` Mathias Nyman
2020-02-14  8:36         ` Tejas Joglekar
2020-03-03 10:24           ` Tejas Joglekar
2020-03-03 14:47             ` Mathias Nyman
2020-03-16 17:09               ` Tejas Joglekar
2020-03-17  8:48                 ` Mathias Nyman
2019-12-20 13:39 ` [RFC PATCH 2/4] usb: dwc3: Add device property consolidate-trbs Tejas Joglekar
2019-12-20 13:40 ` [RFC PATCH 3/4] usb: xhci: Set quirk for XHCI_CONSOLIDATE_TRBS Tejas Joglekar
2019-12-20 13:40 ` [RFC PATCH 4/4] dt-bindings: usb: Add snps,consolidate-trbs & consolidate-trbs Tejas Joglekar
2020-01-08 15:19   ` Rob Herring

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7d042091-66b5-c245-73c8-f4491ea037c3@synopsys.com \
    --to=tejas.joglekar@synopsys.com \
    --cc=John.Youn@synopsys.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@intel.com \
    --cc=mathias.nyman@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).