Re: [(RT RFC) PATCH v2 5/9] adaptive real-time lock support
From: Pavel Machek
Date: Mon Feb 25 2008 - 17:03:05 EST
Hi!
> +/*
> + * Adaptive-rtlocks will busywait when possible, and sleep only if
> + * necessary. Note that the busyloop looks racy, and it is....but we do
> + * not care. If we lose any races it simply means that we spin one more
> + * time before seeing that we need to break-out on the next iteration.
> + *
> + * We realize this is a relatively large function to inline, but note that
> + * it is only instantiated 1 or 2 times max, and it makes a measurable
> + * performance different to avoid the call.
> + *
> + * Returns 1 if we should sleep
> + *
> + */
> +static inline int
> +adaptive_wait(struct rt_mutex *lock, struct rt_mutex_waiter *waiter,
> + struct adaptive_waiter *adaptive)
> +{
> + int sleep = 0;
> +
> + for (;;) {
> + /*
> + * If the task was re-awoken, break out completely so we can
> + * reloop through the lock-acquisition code.
> + */
> + if (!waiter->task)
> + break;
> +
> + /*
> + * We need to break if the owner changed so we can reloop
> + * and safely acquire the owner-pointer again with the
> + * wait_lock held.
> + */
> + if (adaptive->owner != rt_mutex_owner(lock))
> + break;
> +
> + /*
> + * If we got here, presumably the lock ownership is still
> + * current. We will use it to our advantage to be able to
> + * spin without disabling preemption...
> + */
> +
> + /*
> + * .. sleep if the owner is not running..
> + */
> + if (!adaptive->owner->se.on_rq) {
> + sleep = 1;
> + break;
> + }
> +
> + /*
> + * .. or is running on our own cpu (to prevent deadlock)
> + */
> + if (task_cpu(adaptive->owner) == task_cpu(current)) {
> + sleep = 1;
> + break;
> + }
> +
> + cpu_relax();
> + }
> +
> + put_task_struct(adaptive->owner);
> +
> + return sleep;
> +}
> +
You want to inline this?
> +static inline void
> +prepare_adaptive_wait(struct rt_mutex *lock, struct adaptive_waiter *adaptive)
...
> +#define prepare_adaptive_wait(lock, busy) {}
This is evil. Use empty inline function instead (same for the other
function, there you can maybe get away with it).
Pavel
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/