Re: waking up processes while holding spinlock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Oct 8, 2009 at 7:30 PM, Denis Kirjanov <kirjanov@xxxxxxxxx> wrote:
> Hello dear all!
>
> Suppose, we have the following pseudo code:
>
> spin_lock(&some_lock);
> some_func();
> spin_unlock(&some_lock);
>
> some_fun()
> {
>     .....
>     wake_up_interruptibe_sync(&wait_queue);
>     ....
> }
> Is this correct behavior or not?
>
> This is a call chain:
> wake_up_interruptible_sync ---> wake_up_sync ---> wake_up_common(...,
> sync=1, ...) ---> ... ---> try_to_wake_up(..., sync=1)
> try_to_wake_up invokes resched_task().
> As a result, we invoke one thread, while other holds the lock.
>
> Tell me please, my assumption is correct?
>
> --
> Regards,
> Denis
>

I dont think try_to_wake_up call invokes any rescheduling function.
Also, __wake_up_sync is already calling __wake_up_common with spin
lock held, so i think it is safe what you are trying to do. Please
correct me if I am wrong at any point.

[snip]

void
4349__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive)
4350{
4351        unsigned long flags;
4352        int sync = 1;
4353
4354        if (unlikely(!q))
4355                return;
4356
4357        if (unlikely(!nr_exclusive))
4358                sync = 0;
4359
4360        spin_lock_irqsave(&q->lock, flags);
4361        __wake_up_common(q, mode, nr_exclusive, sync, NULL);
4362        spin_unlock_irqrestore(&q->lock, flags);
4363}

[\snip]


-Vinit

--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx
Please read the FAQ at http://kernelnewbies.org/FAQ



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux