Josip, give this debugging patch a try. It is against 2.6.23.1 but it should apply to most recent kernels. It should give you debugging messages in the kernel log that start with "FUTEX_BUG" if the debugging code triggers. Please post just a few samples of whatever it spits out. Thanks! diff --git a/kernel/futex.c b/kernel/futex.c index fcc94e7..6da8b3c 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -1874,6 +1874,25 @@ err_unlock: return ret; } +static void log_futex_bug(u32 __user *uaddr, struct task_struct *curr, int pi) +{ + struct mm_struct *mm = curr->mm; + struct vm_area_struct *vma; + unsigned long addr; + + printk(KERN_ERR "FUTEX_BUG: Looping too much in futex death\n"); + printk(KERN_ERR "FUTEX_BUG: uaddr[%p] task[%s:%d] pi(%d)\n", + uaddr, curr->comm, curr->pid, pi); + + addr = (unsigned long) uaddr; + vma = find_vma(mm, addr); + if (vma) + printk(KERN_ERR "FUTEX_BUG: VMA start[%lx] end[%lx] flags[%lx]\n", + vma->vm_start, + vma->vm_end, + vma->vm_flags); +} + /* * Process a futex-list entry, check whether it's owned by the * dying task, and do notification if so: @@ -1881,6 +1900,7 @@ err_unlock: int handle_futex_death(u32 __user *uaddr, struct task_struct *curr, int pi) { u32 uval, nval, mval; + int limit = 0; retry: if (get_user(uval, uaddr)) @@ -1903,8 +1923,12 @@ retry: if (nval == -EFAULT) return -1; - if (nval != uval) - goto retry; + if (nval != uval) { + if (++limit < 100) + goto retry; + log_futex_bug(uaddr, curr, pi); + put_user(mval, uaddr); + } /* * Wake robust non-PI futexes here. The wakeup of - To unsubscribe from this list: send the line "unsubscribe sparclinux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html