From: "J. Bruce Fields" <bfields@fieldses.org>
To: Artem Bityutskiy <dedekind1@gmail.com>
Cc: Neil Brown <neilb@suse.de>,
linux-nfs@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] sunrpc: make the cache cleaner workqueue deferrable
Date: Tue, 6 Jul 2010 12:28:16 -0400 [thread overview]
Message-ID: <20100706162815.GE7387@fieldses.org> (raw)
In-Reply-To: <1277996756-8415-1-git-send-email-dedekind1@gmail.com>
On Thu, Jul 01, 2010 at 06:05:56PM +0300, Artem Bityutskiy wrote:
> From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
>
> This patch makes the cache_cleaner workqueue deferrable, to prevent
> unnecessary system wake-ups, which is very important for embedded
> battery-powered devices.
>
> do_cache_clean() is called every 30 seconds at the moment, and often
> makes the system wake up from its power-save sleep state. With this
> change, when the workqueue uses a deferrable timer, the
> do_cache_clean() invocation will be delayed and combined with the
> closest "real" wake-up. This improves the power consumption situation.
>
> Note, I tried to create a DECLARE_DELAYED_WORK_DEFERRABLE() helper
> macro, similar to DECLARE_DELAYED_WORK(), but failed because of the
> way the timer wheel core stores the deferrable flag (it is the
> LSBit in the time->base pointer). My attempt to define a static
> variable with this bit set ended up with the "initializer element is
> not constant" error.
>
> Thus, I have to use run-time initialization, so I created a new
> cache_initialize() function which is called once when sunrpc is
> being initialized.
Thanks, applying for 2.6.36.
--b.
>
> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
> ---
> include/linux/sunrpc/cache.h | 1 +
> net/sunrpc/cache.c | 7 ++++++-
> net/sunrpc/sunrpc_syms.c | 1 +
> 3 files changed, 8 insertions(+), 1 deletions(-)
>
> diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h
> index 6f52b4d..7bf3e84 100644
> --- a/include/linux/sunrpc/cache.h
> +++ b/include/linux/sunrpc/cache.h
> @@ -192,6 +192,7 @@ extern int cache_check(struct cache_detail *detail,
> extern void cache_flush(void);
> extern void cache_purge(struct cache_detail *detail);
> #define NEVER (0x7FFFFFFF)
> +extern void __init cache_initialize(void);
> extern int cache_register(struct cache_detail *cd);
> extern void cache_unregister(struct cache_detail *cd);
>
> diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c
> index 58de76c..939d048 100644
> --- a/net/sunrpc/cache.c
> +++ b/net/sunrpc/cache.c
> @@ -320,7 +320,7 @@ static struct cache_detail *current_detail;
> static int current_index;
>
> static void do_cache_clean(struct work_struct *work);
> -static DECLARE_DELAYED_WORK(cache_cleaner, do_cache_clean);
> +static struct delayed_work cache_cleaner;
>
> static void sunrpc_init_cache_detail(struct cache_detail *cd)
> {
> @@ -1504,6 +1504,11 @@ static int create_cache_proc_entries(struct cache_detail *cd)
> }
> #endif
>
> +void __init cache_initialize(void)
> +{
> + INIT_DELAYED_WORK_DEFERRABLE(&cache_cleaner, do_cache_clean);
> +}
> +
> int cache_register(struct cache_detail *cd)
> {
> int ret;
> diff --git a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c
> index f438347..c52b184 100644
> --- a/net/sunrpc/sunrpc_syms.c
> +++ b/net/sunrpc/sunrpc_syms.c
> @@ -43,6 +43,7 @@ init_sunrpc(void)
> #ifdef CONFIG_PROC_FS
> rpc_proc_init();
> #endif
> + cache_initialize();
> cache_register(&ip_map_cache);
> cache_register(&unix_gid_cache);
> svc_init_xprt_sock(); /* svc sock transport */
> --
> 1.7.0.1
>
next prev parent reply other threads:[~2010-07-06 16:28 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-01 15:05 [PATCH] sunrpc: make the cache cleaner workqueue deferrable Artem Bityutskiy
2010-07-05 12:31 ` Artem Bityutskiy
2010-07-06 16:29 ` J. Bruce Fields
2010-07-06 16:28 ` J. Bruce Fields [this message]
2010-07-06 17:19 ` [PATCH] timers.c: document meaning of deferrable timer J. Bruce Fields
2010-07-17 12:30 ` Artem Bityutskiy
2010-07-17 12:30 ` Artem Bityutskiy
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=20100706162815.GE7387@fieldses.org \
--to=bfields@fieldses.org \
--cc=dedekind1@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.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.