down_interruptible() return non-zero value once signal is received and trying down_interruptible again in loop return value is always non-zero

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

 



Hi,

In kernel driver, using Semaphore to block on resources (Descriptors and memory).
Semaphore is initialized in locking state using call "init_MTEX_LOCKED()", when resources are not available process calls down_interruptible() and blocks. Once resources are freed up() is called, and blocked process is unblocked. up() is called from interrupt context which frees resources on receiving ACK-Interrupt.
Following is the code snippet for blocking:
do {
    ret = down_interruptible(sem)
    if (ret == 0) {
        break;
    } else {
        printk("Semaphore is not acquired try again\n");
        continue;
   }
} while (1);

While loop is used to make sure down_interrptible() is called until process acquires the semaphore. If process receives signal, process unblocks from down_interrptible() without acquiring the semaphore.
Issue am seeing is once signal is received under the blocking state, again trying to acquire semaphore using down_interruptible() return value is always non-zero and process is looping in while loop.

Can someone explain this behavior, I wrote the code with expectation that after signal is received again trying to acquire lock will either block the process or process will get semaphore.
Please help me on this.

Thanks,
Mushtaq Khan
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

[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