lkml.org 
[lkml]   [2008]   [Feb]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [(RT RFC) PATCH v2 5/9] adaptive real-time lock support
    >>> On Mon, Feb 25, 2008 at  5:03 PM, in message
    <20080225220313.GG2659@elf.ucw.cz>, Pavel Machek <pavel@ucw.cz> wrote:
    > 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?

    Yes. As the comment indicates, there are 1-2 users tops, and it has a significant impact on throughput (> 5%) to take the hit with a call. I don't think its actually much code anyway...its all comments.

    >
    >> +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).

    Ok.


    > Pavel





    \
     
     \ /
      Last update: 2008-02-26 01:57    [W:0.025 / U:3.612 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site