lkml.org 
[lkml]   [2019]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC PATCH v1 02/25] printk-rb: add prb locking functions
    On (02/12/19 15:29), John Ogness wrote:
    > +static bool __prb_trylock(struct prb_cpulock *cpu_lock,
    > + unsigned int *cpu_store)
    > +{
    > + unsigned long *flags;
    > + unsigned int cpu;
    > +
    > + cpu = get_cpu();
    > +
    > + *cpu_store = atomic_read(&cpu_lock->owner);
    > + /* memory barrier to ensure the current lock owner is visible */
    > + smp_rmb();
    > + if (*cpu_store == -1) {
    > + flags = per_cpu_ptr(cpu_lock->irqflags, cpu);
    > + local_irq_save(*flags);
    > + if (atomic_try_cmpxchg_acquire(&cpu_lock->owner,
    > + cpu_store, cpu)) {
    > + return true;
    > + }
    > + local_irq_restore(*flags);
    > + } else if (*cpu_store == cpu) {
    > + return true;
    > + }
    > +
    > + put_cpu();
    > + return false;
    > +}
    > +
    > +/*
    > + * prb_lock: Perform a processor-reentrant spin lock.
    > + * @cpu_lock: A pointer to the lock object.
    > + * @cpu_store: A "flags" pointer to store lock status information.
    > + *
    > + * If no processor has the lock, the calling processor takes the lock and
    > + * becomes the owner. If the calling processor is already the owner of the
    > + * lock, this function succeeds immediately. If lock is locked by another
    > + * processor, this function spins until the calling processor becomes the
    > + * owner.
    > + *
    > + * It is safe to call this function from any context and state.
    > + */
    > +void prb_lock(struct prb_cpulock *cpu_lock, unsigned int *cpu_store)
    > +{
    > + for (;;) {
    > + if (__prb_trylock(cpu_lock, cpu_store))
    > + break;
    > + cpu_relax();
    > + }
    > +}

    Any chance to make it more fair? A ticket based lock, perhaps?

    -ss

    \
     
     \ /
      Last update: 2019-03-07 03:13    [W:4.142 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site