I'm not sure if this is the correct list for this question.
If not perhaps someone can direct me to the correct list.
I have a device driver developed with 2.4 kernels. I've ported
it to the 2.6 kernel (FC3) and it all works fine except for one
aspect of procfs.
My device driver sets up an entry in the /proc tree. A process
can open this entry and read from it. Normally the read blocks
until an event happens elsewhere in the device driver. When the
event happens the blocked process is woken up and the read
returns the information it was waiting for.
THE PROBLEM: In FC3 (2.6.11-13_FC3) the reading process blocks but it
never wakes up.
Here is a code fragment from the driver where the reading
process would block:
/* Wait until the next image header has been read. */
/* But only wait if we are reading from the beginning. */
if (offset == 0) {
printk("####%s waiting event %x\n",__FUNCTION__,(unsigned
int)&dev->read_proc_wait);
wait_event_interruptible(dev->read_proc_wait,(offset != 0));
printk("####%s WOKE UP\n",__FUNCTION__);
/* See if our sleep was interrupted by a signal. */
if (signal_pending(current)) {
*buffer_location = my_buffer;
printk("####%s returns error due to pending
signal\n",__FUNCTION__);
return -EINTR;
}
}
Here is a code fragment that is trying to wake up the blocked process:
/* Wake up anyone waiting on reading /proc/readXw */
printk(KERN_INFO "#### waking up anyone waiting on
read_proc_wait event %x\n",
(unsigned int)&dev->read_proc_wait);
wake_up_interruptible(&dev->read_proc_wait);
I see the blocked process "waiting event..." message and I see the
"waking up..."
message. But I never get the "WOKE UP" message and the waiting process
never returns.
If I kill the waiting process I do see "WOKE UP" and "returns error due
to pending signal"
messages so I know it has in fact been waiting. The address of
dev->read_proc_wait
is the same in both the "waiting event..." and "waking up..." messages.
I've initialize dev->read_proc_wait just like several other event flags
in the
same device driver: init_waitqueue_head(&(dev->read_proc_wait));
I can not see any reason why the waiting process wouldn't wake up.
If anybody has any suggestions I would appreciate the help.
Thanks.
Richard Stover