From: Stephen Warren <swarren@wwwdotorg.org>
To: u-boot@lists.denx.de
Subject: [U-Boot] [RFC PATCH 1/2] add block device cache
Date: Thu, 17 Mar 2016 15:16:58 -0600 [thread overview]
Message-ID: <56EB1ECA.3030204@wwwdotorg.org> (raw)
In-Reply-To: <1458164424-15363-2-git-send-email-eric@nelint.com>
On 03/16/2016 03:40 PM, Eric Nelson wrote:
> Signed-off-by: Eric Nelson <eric@nelint.com>
A patch description would be useful here; the cover letter wouldn't be
checked in.
> diff --git a/drivers/block/cache_block.c b/drivers/block/cache_block.c
> +static int cache_iftype = -1;
> +static int cache_devnum = -1;
> +static lbaint_t cache_start = -1;
> +static lbaint_t cache_blkcnt = -1;
> +static unsigned long cache_blksz;
> +static void *cache;
Since variable "cache" is in BSS and hence is 0, which is included in
all checks below, none of the other values need to be initialized.
> +int cache_block_read(int iftype, int dev,
> + lbaint_t start, lbaint_t blkcnt,
> + unsigned long blksz, void *buffer)
> +{
> + if ((iftype == cache_iftype) &&
> + (dev == cache_devnum) &&
> + (start == cache_start) &&
> + (blkcnt <= cache_blkcnt) &&
> + (blksz == cache_blksz) &&
> + (cache != 0)) {
I'd suggest putting (cache != 0) first, since that check indicates
whether any of the others are relevant.
> + memcpy(buffer, cache, blksz*blkcnt);
Nit: space around the * operator. Same comment everywhere.
It's probably hard to fix this given the simple API and lack of MMU
page-tables to remap on a per-page basis, but one deficiency in this
(deliberately) simple implementation is that if someone caches blocks
0..7 then later tries to read 2..10 (or even 2..3) they won't get a
cache hit. While partial hits (the 2..10 case) are hard to deal with,
perhaps it's useful to make subset cases (2..3 with 0..7 cached) work?
> +void cache_block_fill(int iftype, int dev,
> + lbaint_t start, lbaint_t blkcnt,
> + unsigned long blksz, void const *buffer)
> + bytes = blksz*blkcnt;
> + if (cache != 0) {
> + if (bytes != (cache_blksz*cache_blkcnt)) {
> + free(cache);
> + cache = malloc(blksz*blkcnt);
> + if (!cache)
> + return;
> + } /* change in size */
> + } else {
> + cache = malloc(blksz*blkcnt);
> + if (!cache)
> + return;
> + }
Is it better to put the if (!cache) test after the whole if/else block
so it's unified?
> +void cache_block_invalidate(int iftype, int dev)
> +{
> + cache_iftype = -1;
That isn't actually necessary, since assigning 0 to cache below will
prevent anything from using the cache.
> + if (cache) {
> + free(cache);
> + cache = 0;
> + }
> +}
> diff --git a/include/part.h b/include/part.h
> +#ifdef CONFIG_BLOCK_CACHE
> +/**
> + * cache_block_read() - attempt to read a set of blocks from cache
> + *
> + * @param iftype - IF_TYPE_x for type of device
> + * @param dev - device index of particular type
> + * @param start - starting block number
> + * @param blkcnt - number of blocks to read
> + * @param blksz - size in bytes of each block
> + * @param buf - buffer to contain cached data
s/contain/receive/?
> + *
> + * @return - '1' if block returned from cache, '0' otherwise.
> + */
> +int cache_block_read
> + (int iftype, int dev,
> + lbaint_t start, lbaint_t blkcnt,
> + unsigned long blksz, void *buffer);
Nit: ( and probably the first n parameters should be on the same line as
the function name.
next prev parent reply other threads:[~2016-03-17 21:16 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-16 18:42 [U-Boot] ext4 and caching Eric Nelson
2016-03-16 21:40 ` [U-Boot] [RFC PATCH 0/2] simple cache layer for block devices Eric Nelson
2016-03-16 21:40 ` [U-Boot] [RFC PATCH 1/2] add block device cache Eric Nelson
2016-03-17 21:16 ` Stephen Warren [this message]
2016-03-17 21:33 ` Eric Nelson
2016-03-17 21:41 ` Stephen Warren
2016-03-20 22:13 ` Tom Rini
2016-03-20 22:51 ` Eric Nelson
2016-03-16 21:40 ` [U-Boot] [RFC PATCH 2/2] mmc: add support for " Eric Nelson
2016-03-17 21:23 ` Stephen Warren
2016-03-20 19:35 ` Eric Nelson
2016-03-20 22:13 ` Tom Rini
2016-03-20 22:54 ` Eric Nelson
2016-03-21 18:31 ` Eric Nelson
2016-03-26 0:11 ` Eric Nelson
2016-04-09 17:55 ` Simon Glass
2016-04-10 14:31 ` Eric Nelson
2016-03-21 14:27 ` Eric Nelson
2016-03-19 15:42 ` [U-Boot] ext4 and caching Ioan Nicu
2016-03-20 15:02 ` Eric Nelson
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=56EB1ECA.3030204@wwwdotorg.org \
--to=swarren@wwwdotorg.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.