I am writing device drivers for Linux and am puzzled about the behavior
for the queue() and semephore kernel functions. I am kernel version 2.0.0
I am tring to get a MUTEX (binary) semephore to work from within a
device driver. I am writing a device driver for an 8 axis
motor controller. Since independent processes may control an individual
axis and Only one process should read/write to the controller at a time
(so we don't confuse the controller). I want to embedded the semephore
control inside the driver.
I know atomic operation can be done using cli(), but communication with
board could take up to many miliseconds. I just need to guard access to
resource, queuing user processes, AND serving them in a First-In-First-Out
method. Only processes waiting for the devices should block.
1. First I tried using add_wait_queue() and remove_wait_queue, but
remove_wait_queue() seems to remove ALL the processes waiting on a single
queue.
2. After poking around some more, I tried using the down(&sem) amd up(&sem).
To test this, I wrote somethime like this:
static int Sem = MUTEX;
down( &Sem );
printk("sem - got it. %d\n", id);
/*.... do some processing */
up( &Sem );
printk("sem - up() %d\n", id);
if I have 2 processes, A & B, making repeated calls to this iocntl()
is seem one would continuously lock and release the semephore. So,
if the both made repeated iocntl() call, task B would be waiting on
the queue, A would release the sem by calling up(), exit & re-enter
the driver, and lock the semephore before B. I even tried putting a
schedule() call after up(). But same behavior.
Is there a way to get a MUTEX (binary) semephore which release queued
processes in a FIFO order. This would seem like a need kernel service
for device driver writers.
Any suggestions / Comments?
Tony
/-----------------------------------------------------------------------------\
| Tony Denault | email: denault@irtf.ifa.hawaii.edu |
| Institute for Astronomy | Phone: (808) 956-8101 |
| 2680 Woodlawn Drive,Honolulu, HI 96822 | Fax: (808) 988-3893 |
\-----------------------------------------------------------------------------/