public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Mike Frysinger <vapier@gentoo.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v8] usb: align buffers at cacheline
Date: Sat, 10 Mar 2012 21:35:51 -0500	[thread overview]
Message-ID: <201203102135.53944.vapier@gentoo.org> (raw)
In-Reply-To: <4F570A56.8080600@nvidia.com>

On Wednesday 07 March 2012 02:12:22 puneets wrote:
> On Tuesday 06 March 2012 08:37 AM, Mike Frysinger wrote:
> >> --- a/drivers/usb/host/ehci-hcd.c
> >> +++ b/drivers/usb/host/ehci-hcd.c
> >> 
> >>   static void flush_invalidate(u32 addr, int size, int flush)
> >>   {
> >> +	/*
> >> +	 * Size is the bytes actually moved during transaction,
> >> +	 * which may not equal to the cache line. This results
> >> +	 * stop address passed for invalidating cache may not be aligned.
> >> +	 * Therfore making size as multiple of cache line size.
> >> +	 */
> >> +	size = ALIGN(size, ARCH_DMA_MINALIGN);
> >> +
> >>   	if (flush)
> >>   		flush_dcache_range(addr, addr + size);
> >>   	else
> > 
> > i think this is wrong and merely hides the errors from higher up instead
> > of fixing them.  the point of the warning was to tell you that the code
> > was invalidating *too many* bytes.  this code still invalidates too many
> > bytes without any justification as for why it's OK to do here.  further,
> > this code path only matters to the invalidation logic, not the flush
> > logic.
> 
> The sole purpose of this patch to remove the warnings as start/stop
> address sent for invalidating
> is unaligned. Without this patch code works fine but with lots of
> spew...Which we don't want and discussed
> in earlier thread which Simon posted. Please have a look on following link.
> 
> As I understood, you agree that we need to align start/stop buffer
> address and also agree that
> to align stop address we need to align size as start address is already
> aligned.
> Now, "why its OK to do here"?
> We could have aligned the size in two places, cache_qtd() and cache_qh()
> but then we need to place alignment check
> at all the places where size is passed. So I thought better Aligning at
> flush_invalidate() and "ALIGN" macro does not
> increase the size if size is already aligned.

i think you missed my point.  consider a func which has local vars like so:
	int i;
	char buf[1024];
	int k;

and let's say you're running on a core that has a cache line size of 32 bytes 
(which is fairly common).  if you execute a data cache invalid insn, the 
smallest region it can invalidate is 32 bytes.  doesn't matter if you only 
want to invalidate a buffer of 8 bytes ... everything else around it gets 
invalidated as well.

now, in the aforementioned stack, if it starts off aligned nicely at a 32 byte 
boundary, the integer "i" will share a cache line with the first 28 bytes of 
buffer "buf", and the integer "k" will share a cache line with the last 4 bytes 
of the buffer "buf".  (let's ignore what might or might not happen based on gcc 
since this example can trivially be expanded to structure layout.)

the trouble is when you attempt to invalidate the contents of "buf".  if the 
cache is in writeback mode (which means you could have changes in the cache 
which are not reflected in external RAM), then invalidating buf will also 
discard values that might be in "i" or "k".  this is why Simon put a warning 
in the core data cache invalidate function.  if the cache were in writethrough 
mode (which also tends to be the default), then most likely things would work 
fine and no one would notice.  or if the data cache was merely flushed, things 
would work, but at a decrease in performance: you'd be flushing cache lines to 
external memory that you know will be overwritten by a following transaction 
-- most likely DMA from a peripheral such as the USB controller, and you'd be 
flushing objects that the DMA wouldn't be touching, so they'd have to get 
refetched from external RAM ("i" and "k" in my example above).

simply rounding the address down to the start of the cache line and the length 
up to a multiple of a cache line to keep the core code from issuing the 
warning doesn't fix the problem i describe above.  you actually get the worst 
of both worlds -- silent runtime misbehavior when extra memory gets 
invalidated.

perhaps the warning in the core code could be dropped and all your changes in 
fringe code obsoleted (such as these USB patches): when it detects that an 
address is starting on an unaligned boundary, *flush* that line first, and then 
let it be invalidated.  accordingly, when the end length is on an unaligned 
boundary, do the same flush-then-invalidate step.  this should also make things 
work without a (significant) loss in performance.  if anything, i suspect the 
overhead of doing runtime buffer size calculations and manually aligning 
pointers (which is what ALLOC_CACHE_ALIGN_BUFFER does) is a wash compared to 
partially flushing cache lines in the core ...

Simon: what do you think of this last idea ?
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120310/8aa995cf/attachment.pgp>

  parent reply	other threads:[~2012-03-11  2:35 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-17 10:50 [U-Boot] [PATCH] usb: align buffers at cache boundary Puneet Saxena
2012-02-17 17:23 ` Mike Frysinger
2012-02-23 14:25   ` [U-Boot] [PATCH 1/2] usb: align buffers at cacheline Puneet Saxena
2012-02-23 18:15     ` Mike Frysinger
2012-02-24 11:27       ` puneets
2012-02-24 12:42     ` Simon Glass
2012-02-27 15:36       ` [U-Boot] [PATCH v2 " Puneet Saxena
2012-02-27 16:49         ` Marek Vasut
2012-02-27 17:03           ` Simon Glass
2012-02-27 17:11             ` Marek Vasut
2012-02-27 17:27               ` Simon Glass
2012-02-29 14:21               ` [U-Boot] [PATCH v3 " Puneet Saxena
2012-02-29 21:35                 ` Marek Vasut
2012-03-01 13:51                   ` puneets
2012-03-01 18:38                     ` Marek Vasut
2012-03-02  6:56                       ` puneets
2012-03-02 10:43                         ` Marek Vasut
2012-03-02 12:50                           ` puneets
2012-03-02 12:58                             ` Marek Vasut
2012-03-02 13:35                               ` [U-Boot] [PATCH v4] " Puneet Saxena
2012-03-02 13:46                                 ` Marek Vasut
2012-03-02 14:00                                   ` puneets
2012-03-02 14:41                                     ` Marek Vasut
2012-03-02 15:21                                       ` puneets
2012-03-02 15:59                                         ` Marek Vasut
2012-03-02 16:45                                           ` Wolfgang Denk
2012-03-05  7:16                                             ` [U-Boot] [PATCH v5] " Puneet Saxena
2012-03-05 13:24                                               ` Eric Nelson
2012-03-05 13:35                                                 ` Marek Vasut
2012-03-05 14:46                                                 ` [U-Boot] [PATCH v8] " Puneet Saxena
2012-03-05 15:35                                                   ` Marek Vasut
2012-03-05 18:18                                                   ` Simon Glass
2012-03-06  0:36                                                     ` Marek Vasut
2012-03-06  0:39                                                       ` Marek Vasut
2012-03-06  7:00                                                     ` puneets
2012-03-06  8:22                                                       ` Marek Vasut
2012-03-06  3:07                                                   ` Mike Frysinger
2012-03-07  7:12                                                     ` puneets
2012-03-07  9:20                                                       ` puneets
2012-03-07 22:06                                                       ` Marek Vasut
2012-03-08 11:21                                                         ` puneets
2012-03-08 14:12                                                           ` Marek Vasut
2012-03-09  6:15                                                             ` puneets
2012-03-09 12:03                                                               ` Marek Vasut
2012-03-11  2:35                                                       ` Mike Frysinger [this message]
2012-03-14  2:05                                                         ` Marek Vasut
2012-03-16  4:39                                                       ` Marek Vasut
2012-03-16  7:42                                                         ` puneets
2012-03-16  8:52                                                           ` Marek Vasut
2012-03-19 14:29                                                             ` puneets
2012-03-19 14:43                                                               ` Marek Vasut
2012-03-19 15:19                                                                 ` Tom Warren
2012-03-19 15:46                                                                   ` Marek Vasut
2012-04-02 15:59                                                                     ` Tom Warren
2012-04-02 16:11                                                                       ` Marek Vasut
2012-04-02 16:16                                                                         ` Tom Warren
2012-04-02 16:32                                                                           ` Marek Vasut
2012-04-03  6:05                                                                             ` puneets
2012-03-05  7:27                                             ` [U-Boot] [PATCH v6] " Puneet Saxena
2012-03-05 12:03                                               ` Marek Vasut
2012-03-05 12:21                                                 ` [U-Boot] [PATCH v7] " Puneet Saxena
2012-03-05 12:41                                                   ` Marek Vasut
2012-03-06  3:28                                             ` [U-Boot] [PATCH v4] " Mike Frysinger
2012-03-06  8:24                                               ` Marek Vasut
2012-03-06 16:42                                                 ` Mike Frysinger
2012-02-29 14:21               ` [U-Boot] [PATCH v3 2/2] usb: Add CONFIG to fetch string descriptor Puneet Saxena
2012-02-29 21:29                 ` Marek Vasut
2012-03-01 11:07                   ` puneets
2012-03-01 11:45                     ` Marek Vasut
2012-03-01 12:59                       ` puneets
2012-03-01 13:13                         ` Marek Vasut
2012-03-05 12:48                           ` Marek Vasut
2012-03-05 13:14                             ` puneets
2012-03-05 21:15                               ` Marek Vasut
2012-02-28  9:34           ` [U-Boot] [PATCH v2 1/2] usb: align buffers at cacheline puneets
2012-02-29 21:38             ` Marek Vasut
2012-02-27 15:36       ` [U-Boot] [PATCH v2 2/2] usb: Add CONFIG to fetch string descriptor Puneet Saxena
2012-02-27 18:28         ` Mike Frysinger
2012-02-27 15:37       ` [U-Boot] [PATCH 1/2] usb: align buffers at cacheline puneets
2012-02-23 14:25   ` [U-Boot] [PATCH 2/2] usb: Add quirk "USB_QUIRK_STRING_FETCH_255" Puneet Saxena
2012-02-23 15:20     ` Tom Rini
2012-02-23 16:04     ` Tom Warren
2012-02-24  7:52       ` puneets

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=201203102135.53944.vapier@gentoo.org \
    --to=vapier@gentoo.org \
    --cc=u-boot@lists.denx.de \
    /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