2005-03-09 23:54:54

by Jeff Dike

[permalink] [raw]
Subject: [PATCH 5/9] UML - change semaphores to completions

From: Esben Nielsen <simlo at phys au dk>

One of the problems was use of direct architecture specific semaphores
(which doesn't work under PREEMPT_REALTIME) and in places where a quick
(maybe too quick) look at the code told me that completions ought to be
used. Therefore I changed two semaphores to completions which compiled
fine. I have tried the change on 2.6.11-rc2, and it seemed to work, but I
have not tested it heavily.

Signed-off-by: Jeff Dike <[email protected]>

Index: linux-2.6.11/arch/um/drivers/port_kern.c
===================================================================
--- linux-2.6.11.orig/arch/um/drivers/port_kern.c 2005-03-08 20:17:34.000000000 -0500
+++ linux-2.6.11/arch/um/drivers/port_kern.c 2005-03-08 22:16:48.000000000 -0500
@@ -25,7 +25,7 @@
struct list_head list;
atomic_t wait_count;
int has_connection;
- struct semaphore sem;
+ struct completion done;
int port;
int fd;
spinlock_t lock;
@@ -68,7 +68,7 @@
conn->fd = fd;
list_add(&conn->list, &conn->port->connections);

- up(&conn->port->sem);
+ complete(&conn->port->done);
return(IRQ_HANDLED);
}

@@ -197,13 +197,14 @@
{ .list = LIST_HEAD_INIT(port->list),
.wait_count = ATOMIC_INIT(0),
.has_connection = 0,
- .sem = __SEMAPHORE_INITIALIZER(port->sem,
- 0),
.lock = SPIN_LOCK_UNLOCKED,
.port = port_num,
.fd = fd,
.pending = LIST_HEAD_INIT(port->pending),
.connections = LIST_HEAD_INIT(port->connections) });
+
+ init_completion(&port->done),
+
list_add(&port->list, &ports);

found:
@@ -237,7 +238,7 @@
atomic_inc(&port->wait_count);
while(1){
fd = -ERESTARTSYS;
- if(down_interruptible(&port->sem))
+ if(wait_for_completion_interruptible(&port->done))
goto out;

spin_lock(&port->lock);
@@ -308,14 +309,3 @@
}

__uml_exitcall(free_port);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only. This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
Index: linux-2.6.11/arch/um/drivers/xterm_kern.c
===================================================================
--- linux-2.6.11.orig/arch/um/drivers/xterm_kern.c 2005-03-08 20:17:34.000000000 -0500
+++ linux-2.6.11/arch/um/drivers/xterm_kern.c 2005-03-08 22:16:48.000000000 -0500
@@ -16,7 +16,7 @@
#include "xterm.h"

struct xterm_wait {
- struct semaphore sem;
+ struct completion ready;
int fd;
int pid;
int new_fd;
@@ -32,7 +32,7 @@
return(IRQ_NONE);

xterm->new_fd = fd;
- up(&xterm->sem);
+ complete(&xterm->ready);
return(IRQ_HANDLED);
}

@@ -49,10 +49,10 @@

/* This is a locked semaphore... */
*data = ((struct xterm_wait)
- { .sem = __SEMAPHORE_INITIALIZER(data->sem, 0),
- .fd = socket,
+ { .fd = socket,
.pid = -1,
.new_fd = -1 });
+ init_completion(&data->ready);

err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt,
SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM,
@@ -68,7 +68,7 @@
*
* XXX Note, if the xterm doesn't work for some reason (eg. DISPLAY
* isn't set) this will hang... */
- down(&data->sem);
+ wait_for_completion(&data->ready);

free_irq_by_irq_and_dev(XTERM_IRQ, data);
free_irq(XTERM_IRQ, data);


2005-03-10 01:22:31

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH 5/9] UML - change semaphores to completions

Jeff Dike <[email protected]> wrote:
>
> @@ -197,13 +197,14 @@
> { .list = LIST_HEAD_INIT(port->list),
> .wait_count = ATOMIC_INIT(0),
> .has_connection = 0,
> - .sem = __SEMAPHORE_INITIALIZER(port->sem,
> - 0),
> .lock = SPIN_LOCK_UNLOCKED,
> .port = port_num,
> .fd = fd,
> .pending = LIST_HEAD_INIT(port->pending),
> .connections = LIST_HEAD_INIT(port->connections) });
> +
> + init_completion(&port->done),
> +

I'll convert that to a semicolon...

2005-03-11 22:19:05

by Jeff Dike

[permalink] [raw]
Subject: Re: [PATCH 5/9] UML - change semaphores to completions

[email protected] said:
> > +
> > + init_completion(&port->done),
> > +
>
> I'll convert that to a semicolon...

Gawd, thanks...

Jeff