>>> On Mon, Feb 25, 2008 at  5:03 PM, in message
<[EMAIL PROTECTED]>, Pavel Machek <[EMAIL PROTECTED]> 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



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to