Skip to contentSkip to conversation

urcu: fix compat_futex_noasync()

PATCH Mathieu Desnoyers 1 participant 1 message Aug 9, 2012 1 message not in the archive

lore
Share & tools
lore

Mathieu Desnoyers

author Applied
#1 lore raw
In reply to a message not in the archive
Quoted 10 lines · * Lai Jiangshan ([email protected]) wrote:

This patch fix two critical problems:

1) compat_futex_cond is not bound to any @uaddr, it services all @uaddr, if you wakeup only one thread(pthread_cond_signal), the @uaddr of this waking thread and the @uaddr of the woken-up thread may be different. the the woken-up thread will very probably go to sleep again because his own condition is not true.

*And* this waking thread(FUTEX_WAKE) wake up NOTHING.

Quoted 7 lines

2) If the caller want to wake up all waiting threads, he will use INT_MAX for @val. and

		for (i = 0; i < INT_MAX; i++)
			pthread_cond_signal(&compat_futex_cond);

becomes almost infinity loop.

Good catch !

Merged, thanks!

Mathieu

Quoted 24 lines

---

compat_futex.c +2 -3
index 04de596..bb928e6 100644
@@ -43,7 +43,7 @@ static pthread_cond_t compat_futex_cond = PTHREAD_COND_INITIALIZER;
 int compat_futex_noasync(int32_t *uaddr, int op, int32_t val,
 	const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
 {
-	int ret, i, gret = 0;
+	int ret, gret = 0;
 
 	/*
 	 * Check if NULL. Don't let users expect that they are taken into
@@ -67,8 +67,7 @@ int compat_futex_noasync(int32_t *uaddr, int op, int32_t val,
 		pthread_cond_wait(&compat_futex_cond, &compat_futex_lock);
 		break;
 	case FUTEX_WAKE:
-		for (i = 0; i < val; i++)
-			pthread_cond_signal(&compat_futex_cond);
+		pthread_cond_broadcast(&compat_futex_cond);
 		break;
 	default:
 		gret = -EINVAL;
Signature · 4 lines
Mathieu Desnoyers
Operating System Efficiency R&D Consultant
EfficiOS Inc.
http://www.efficios.com