Messages in this thread |  | | Date | Tue, 8 May 2001 15:48:45 -0400 (EDT) | From | "Richard B. Johnson" <> |
| |
To driver wizards:
I have a driver which needs to wait for some hardware. Basically, it needs to have some code added to the run-queue so it can get some CPU time even though it's not being called.
It needs to get some CPU time which can be "turned on" or "turned off" as a result of an interrupt or some external input from an ioctl().
So I thought that the "tasklet" would be ideal. However, the scheduler "thinks" that a tasklet is an interrupt, so any attempt to sleep in the tasklet results in a kernel panic, "ieee scheduling in an interrupt..., BUG sched.c line 688".
Next, I added code to try queue_task(). This has the same problem.
Basically the procedure needs to do:
procedure() { if(some_event) schedule_timeout(n); /* Needs to sleep */ else if(something_else) do_something(); queue_task(procedure, &tq_immediate); /* Needs to queue itself again */ }
Since I'm running against a time-line, I temporarily gave the module some CPU time through an ioctl(), i.e., a separate task that does nothing except repeatably execute ioctl(GIVE_CPU, NULL); This shows that the driver actually works. It's a GPIB driver so it needs to get the CPU to find out if it's addressed to listen, etc. These events don't produce interrupts.
So, what am I supposed to do to add a piece of driver code to the run queue so it gets scheduled occasionally?
Cheers, Dick Johnson
Penguin : Linux version 2.4.1 on an i686 machine (799.53 BogoMips).
"Memory is like gasoline. You use it up when you are running. Of course you get it all back when you reboot..."; Actual explanation obtained from the Micro$oft help desk.
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |