On Thu, 19 Sep 2013 16:32:41 +0200
Peter Zijlstra <[email protected]> wrote:


> +extern void __get_online_cpus(void);
> +
> +static inline void get_online_cpus(void)
> +{
> +     might_sleep();
> +
> +     preempt_disable();
> +     if (likely(!__cpuhp_writer || __cpuhp_writer == current))
> +             this_cpu_inc(__cpuhp_refcount);
> +     else
> +             __get_online_cpus();
> +     preempt_enable();
> +}


This isn't much different than srcu_read_lock(). What about doing
something like this:

static inline void get_online_cpus(void)
{
        might_sleep();

        srcu_read_lock(&cpuhp_srcu);
        if (unlikely(__cpuhp_writer || __cpuhp_writer != current)) {
                srcu_read_unlock(&cpuhp_srcu);
                __get_online_cpus();
                current->online_cpus_held++;
        }
}

static inline void put_online_cpus(void)
{
        if (unlikely(current->online_cpus_held)) {
                current->online_cpus_held--;
                __put_online_cpus();
                return;
        }

        srcu_read_unlock(&cpuhp_srcu);
}

Then have the writer simply do:

        __cpuhp_write = current;
        synchronize_srcu(&cpuhp_srcu);

        <grab the mutex here>

-- Steve
--
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