async: use ULLONG_MAX for infinity cookie value
authorTejun Heo <tj@kernel.org>
Wed, 23 Jan 2013 17:32:30 +0000 (09:32 -0800)
committerTejun Heo <tj@kernel.org>
Wed, 23 Jan 2013 17:32:30 +0000 (09:32 -0800)
commitc68eee14ec2da345e86f2778c8570759309a4a2e
tree953677198feb57ebd17b6d2c197cf8febc88a6c4
parent8723d5037cafea09c7242303c6c8e5d7058cec61
async: use ULLONG_MAX for infinity cookie value

Currently, next_cookie is used as the infinity value.  In most cases,
this should work fine but it theoretically could bring subtle behavior
difference between async_synchronize_full() and
async_synchronize_full_domain().

async_synchronize_full() keeps waiting until there's no registered
async_entry left regardless of what next_cookie was when the function
was called.  It guarantees that the queue is completely drained at
least once before returning.

However, async_synchronize_full_domain() doesn't.  It synchronizes
upto next_cookie and if further async jobs are queued after the
next_cookie value to synchronize is decided, they won't be waited for.

For unrelated async jobs, the behavior difference doesn't matter;
however, if async jobs which are related (nested or otherwise) to the
executing ones are queued while sychronization is in progress, the
resulting behavior difference could be problematic.

This can be easily fixed by using ULLONG_MAX as the infinity value
instead.  Define ASYNC_COOKIE_MAX as ULLONG_MAX and use it as the
infinity value for synchronization.  This makes
async_synchronize_full_domain() fully drain the domain at least once
before returning, making its behavior match async_synchronize_full().

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Dan Williams <djbw@fb.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
kernel/async.c