From: Jens Haerer <jens.haerer@gmx.net>
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: waitqueue problem on 2.4.3
Date: Sun, 20 May 2001 22:17:54 +0200 [thread overview]
Message-ID: <3B082672.63D1F44E@gmx.net> (raw)
Hy to all !
I am experiencing big problems using wait queues in a device driver
(module)
on kernel 2.4.3-20mdk (gcc version 2.96).
I dont know if this is the right place to ask for - but its my last hope...
The device driver i write is for a measuring device connected to parallel
port-
so i'm using the parport and parport_pc modules with exclusice access to
the
parallel port. Communication with the device works perfectly with one
exception - i cant use waitqueues - it doesnt matter in which was i try it
(i noticed there were changes to waitqueues in 2.4 kernels)...
the first approach using waitqueues looks like this :
hshppm.c: (the driver)
/* ... */
static DECLARE_WAIT_QUEUE_HEAD( hshppm_isr_digital_wq );
/* ... */
static int device_open( struct inode *inode, struct file *file )
{
/* ... */
init_waitqueue_head(&hshppm_isr_digital_wq);
/* ... */
}
/* ... */
static ssize_t device_read( struct file *file,
char *buffer,
size_t length,
loff_t *offset)
{
/* ... */
interruptible_sleep_on( &hshppm_isr_digital_wq );
/* ... */
}
/* ... */
/* the ISR for the INTs on the parallel port */
/* called from parport_generic_irq() */
void hshppm_isr( int irq, void *handle, struct pt_regs *regs )
{
/* ... */
wake_up_interruptible( &hshppm_isr_digital_wq )
/* ... */
}
When I run this code and execute the read() from userland it does a
segfault
when the module executes the interruptible_sleep_on() - a kernel oops is
recorded in the
log:
May 20 21:01:40 ofen kernel: Unable to handle kernel NULL pointer
dereference at virtual address 0000003d
May 20 21:01:40 ofen kernel: printing eip:
May 20 21:01:40 ofen kernel: c0111c4b
May 20 21:01:40 ofen kernel: pgd entry cae50000: 0000000000000000
May 20 21:01:40 ofen kernel: pmd entry cae50000: 0000000000000000
May 20 21:01:40 ofen kernel: ... pmd not present!
May 20 21:01:40 ofen kernel: Oops: 0000
May 20 21:01:40 ofen kernel: CPU: 0
May 20 21:01:40 ofen kernel: EIP: 0010:[sleep_on+35/88]
May 20 21:01:40 ofen kernel: EIP: 0010:[<c0111c4b>]
May 20 21:01:40 ofen kernel: EFLAGS: 00210086
May 20 21:01:40 ofen kernel: eax: cb53e000 ebx: 00200286 ecx:
00200246 edx: 00000039
May 20 21:01:40 ofen kernel: esi: ce071720 edi: 0804b225 ebp:
cb53ff5c esp: cb53ff48
May 20 21:01:40 ofen kernel: ds: 0018 es: 0018 ss: 0018
May 20 21:01:40 ofen kernel: Process dev_test1 (pid: 1842,
stackpage=cb53f000)
May 20 21:01:40 ofen kernel: Stack: ffffffea 00000000 cb53e000 cb53e000
c0111554 cb53ff9c e8be7232 e8becaf8
May 20 21:01:40 ofen kernel: e8beb383 e8becadc d6fd4000 d5e75960
40016000 0000001a ffffffea d5e75960
May 20 21:01:40 ofen kernel: 0000001a bfffeee8 ffffffea ce071720
00000001 bffff698 c012dca6 ce071720
May 20 21:01:40 ofen kernel: Call Trace: [process_timeout+0/72]
[<e8be7232>] [<e8becaf8>] [<e8beb383>] [<e8becadc>] [sys_read+142/196]
[system_call+51/64]
May 20 21:01:40 ofen kernel: Call Trace: [<c0111554>] [<e8be7232>]
[<e8becaf8>] [<e8beb383>] [<e8becadc>] [<c012dca6>] [<c0106f23>]
May 20 21:01:40 ofen kernel:
May 20 21:01:40 ofen kernel: Code: 8b 42 04 8d 4d f8 89 48 04 8d 4a 04 89
4d fc 89 45 f8 8d 4d
i did the init_waitqueue_head() in device_open() when the device is openend
from userland - so this
should not happen...
i tested the above also with the init_waitqueue_head() omitted in
device_open() - cause the
kernel api changes documented in
http://www.atnf.csiro.au/~rgooch/linux/docs/porting-to-2.4.html
say i doesnt need it.
The second approach i tested look like this:
hshppm.c: (the driver)
/* ... */
static DECLARE_WAIT_QUEUE_HEAD( hshppm_isr_digital_wq );
/* ... */
static int device_open( struct inode *inode, struct file *file )
{
/* ... */
init_waitqueue_head(&hshppm_isr_digital_wq);
/* ... */
}
/* ... */
static ssize_t device_read( struct file *file,
char *buffer,
size_t length,
loff_t *offset)
{
/* ... */
unsigned long flags;
DECLARE_WAITQUEUE (wait, current);
wq_write_lock_irqsave(&(hshppm_isr_digital_wq.lock), flags);
wait.flags = 0;
__add_wait_queue(&hshppm_isr_digital_wq, &wait);
wq_write_unlock_irqrestore(&(hshppm_isr_digital_wq.lock), flags);
current->state = TASK_INTERRUPTIBLE;
schedule();
current->state = TASK_RUNNING;
wq_write_lock_irqsave(&(hshppm_isr_digital_wq.lock), flags);
__remove_wait_queue(&hshppm_isr_digital_wq, &wait);
wq_write_unlock_irqrestore(&(hshppm_isr_digital_wq.lock), flags);
/* ... */
}
/* ... */
/* the ISR for the INTs on the parallel port */
/* called from parport_generic_irq() */
void hshppm_isr( int irq, void *handle, struct pt_regs *regs )
{
/* ... */
wake_up_interruptible( &hshppm_isr_digital_wq )
/* ... */
}
Now wonder ! This time the code in device_read() executes - the process
calling
read() goes to sleep ...
But if an interrupt arrives in hshppm_isr() and the wake_up_interruptible()
is executed
the kernel freezes :(.
I also tested the old way of using waitqueues - just:
struct wait_queue *my_wait_queue;
wake_up_interruptible( &my_wait_queue );
interruptible_sleep_on( &my_wait_queue );
This gave me the same segfault as of my first approach at execution of
interruptible_sleep_on() ...
What am i doing wrong ? I have absolutly no idea why other modules
also containg waitqueue access are running without problems on my system
and the module i compiled is permanently crashing the kernel...
other modules running:
NVdriver 630032 12 (autoclean)
emu10k1 44384 0
soundcore 3504 4 [emu10k1]
nfs 73632 5 (autoclean)
lockd 48720 1 (autoclean) [nfs]
sunrpc 59232 1 (autoclean) [nfs lockd]
af_packet 11280 1 (autoclean)
8139too 11696 1 (autoclean)
keybdev 1632 0 (unused)
usbkbd 2912 0 (unused)
input 3232 0 [keybdev usbkbd]
usb-uhci 20672 0 (unused)
usbcore 47248 1 [usbkbd usb-uhci]
ide-scsi 7568 0
supermount 32496 6 (autoclean)
reiserfs 165760 3
sd_mod 11048 0 (unused)
scsi_mod 86036 2 [ide-scsi sd_mod]
I would be very glad if someone can tell me what i do wrong...
--
Jens Haerer
jens.haerer@gmx.net
next reply other threads:[~2001-05-20 20:16 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-05-20 20:17 Jens Haerer [this message]
2001-05-20 22:42 ` waitqueue problem on 2.4.3 David Woodhouse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3B082672.63D1F44E@gmx.net \
--to=jens.haerer@gmx.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.