linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: Colin Cross <ccross@android.com>
Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	arve@android.com, Oleg Nesterov <oleg@redhat.com>,
	Len Brown <len.brown@intel.com>, Pavel Machek <pavel@ucw.cz>,
	Jeff Layton <jlayton@redhat.com>
Subject: Re: [PATCH v2 03/10] freezer: add new freezable helpers using freezer_do_not_count()
Date: Thu, 2 May 2013 16:55:05 -0700	[thread overview]
Message-ID: <20130502235505.GW19814@mtj.dyndns.org> (raw)
In-Reply-To: <1367458508-9133-4-git-send-email-ccross@android.com>

Hello,

On Wed, May 01, 2013 at 06:35:01PM -0700, Colin Cross wrote:
> To allow tasks to avoid running on every suspend/resume cycle,
> this patch adds additional freezable wrappers around blocking calls
> that call freezer_do_not_count().  Combined with the previous patch,
> these tasks will not run during suspend or resume unless they wake
> up for another reason, in which case they will run until they hit
> the try_to_freeze() in freezer_count(), and then continue processing
> the wakeup after tasks are thawed.  This patch also converts the
> existing wait_event_freezable* wrappers to use freezer_do_not_count().

I'd much prefer the latter part being a separate patch because the
change isn't really trivial and it isn't exactly equivalent - before
we prioritized meeting the condition over freezing, now it's the other
way around.  It's fine but does deserve description in the log so that
if something gets tracked down to the commit, it's easy to tell how
the behavior flipped and why.

> +/* Like schedule_timeout(), but should not block the freezer. */
> +#define freezable_schedule_timeout(timeout)				\
> +({									\
> +	long __retval;							\
> +	freezer_do_not_count();						\
> +	__retval = schedule_timeout(timeout);				\
> +	freezer_count();						\
> +	__retval;							\
> +})
> +
> +/* Like schedule_timeout_interruptible(), but should not block the freezer. */
> +#define freezable_schedule_timeout_interruptible(timeout)		\
> +({									\
> +	long __retval;							\
> +	freezer_do_not_count();						\
> +	__retval = schedule_timeout_interruptible(timeout);		\
> +	freezer_count();						\
> +	__retval;							\
> +})
...
> +/* Like schedule_hrtimeout_range(), but should not block the freezer. */
> +#define freezable_schedule_hrtimeout_range(expires, delta, mode)	\
> +({									\
> +	int __retval;							\
> +	freezer_do_not_count();						\
> +	__retval = schedule_hrtimeout_range(expires, delta, mode);	\
> +	freezer_count();						\
> +	__retval;							\
> +})

(cc'ing Jeff Layton)

So, one worry that I have about this is that freezer essentially
behaves like a huge lock that everyone grabs and while scattering
try_to_freeze() calls around might seem innocuous, it effectively
adding a dependency to that single giant lock to that place, so
whenever you're adding try_to_freeze() call while holding any kind of
locks, it substiantially increases the chance of possible deadlock
scenarios.  NFS recently got bitten by it and now is trying to get rid
of them as it's fundamentally broken.

So, the freezable interface can't be something that people can use
casually.  It is something which should be carefully and strategically
deployed where we *know* that lock dependency risks don't exist or at
least are acceptable.  I'm a bit weary that this patch is expanding
the interface a lot that they now look like the equivalents of normal
schedule calls.  Not exactly sure what to do here but can we please at
least have RED BOLD BLINKING comments which scream to people not to
use these unless they know what they're doing?

Thanks.

-- 
tejun

  reply	other threads:[~2013-05-02 23:55 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-02  1:34 [PATCH v2 00/10] optimize freezing tasks by reducing task wakeups Colin Cross
2013-05-02  1:34 ` [PATCH v2 01/10] freezer: shorten freezer sleep time using exponential backoff Colin Cross
2013-05-02 23:20   ` Tejun Heo
2013-05-02  1:35 ` [PATCH v2 02/10] freezer: skip waking up tasks with PF_FREEZER_SKIP set Colin Cross
2013-05-02 23:24   ` Tejun Heo
2013-05-03  9:24   ` Pavel Machek
2013-05-02  1:35 ` [PATCH v2 03/10] freezer: add new freezable helpers using freezer_do_not_count() Colin Cross
2013-05-02 23:55   ` Tejun Heo [this message]
2013-05-03  0:03     ` Tejun Heo
2013-05-03  2:16       ` Colin Cross
2013-05-03  2:41         ` Colin Cross
2013-05-03  4:09           ` Tejun Heo
2013-05-03  4:12             ` Tejun Heo
2013-05-03  4:17             ` Colin Cross
2013-05-03  4:20               ` Tejun Heo
2013-05-03 14:18             ` Alan Stern
2013-05-03 16:54               ` Tejun Heo
2013-05-02  1:35 ` [PATCH v2 04/10] binder: use freezable blocking calls Colin Cross
2013-05-02  1:35 ` [PATCH v2 05/10] epoll: use freezable blocking call Colin Cross
2013-05-02  1:35 ` [PATCH v2 06/10] select: " Colin Cross
2013-05-02  1:35 ` [PATCH v2 07/10] futex: " Colin Cross
2013-05-02 19:45   ` Thomas Gleixner
2013-05-03  3:12     ` Darren Hart
2013-06-25 21:15   ` [tip:core/locking] futex: Use " tip-bot for Colin Cross
2013-05-02  1:35 ` [PATCH v2 08/10] nanosleep: use " Colin Cross
2013-05-02 19:46   ` Thomas Gleixner
2013-05-02  1:35 ` [PATCH v2 09/10] sigtimedwait: " Colin Cross
2013-05-02  1:35 ` [PATCH v2 10/10] af_unix: use freezable blocking calls in read Colin Cross
2013-05-03  0:08   ` Tejun Heo
2013-05-04 19:19     ` Rafael J. Wysocki
2013-05-04 20:39       ` Tejun Heo
2013-05-04 22:23         ` Colin Cross
2013-05-05 11:23           ` Rafael J. Wysocki
2013-05-02 21:06 ` [PATCH v2 00/10] optimize freezing tasks by reducing task wakeups Rafael J. Wysocki
2013-05-03  0:10   ` Tejun Heo
2013-05-03 11:43     ` Rafael J. Wysocki

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=20130502235505.GW19814@mtj.dyndns.org \
    --to=tj@kernel.org \
    --cc=arve@android.com \
    --cc=ccross@android.com \
    --cc=jlayton@redhat.com \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=oleg@redhat.com \
    --cc=pavel@ucw.cz \
    --cc=rjw@sisk.pl \
    /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).