I have a driver (running under kernel 2.6.11.4-20a) which manages a fairly large number of transmitter and receiver cards. I'm having a major latency problem in the receive side of our testbed, which (at the moment) has 8 receive cards and 2 transmit cards. The interrupt function in each case uses schedule_work() to schedule later handling of interrupt data (as usual). I'm finding that, when the system is under full load, the tx_done tasks end up being handled sequentially with the RX tasks, and thus end up getting excessivly delayed in handling, which is causing an artificial bottleneck in our entire data chain. I need to find some way of separating the handling of the TX events from the handling of the RX events. I was attempting to switch to tasklets for the TX interrupt handlers. However, when I try to instantiate a tasklet for each device: struct my_device { ... struct tasklet_struct my_tasklet; ... } ; // in driver-init function: tasklet_init(&device->my_tasklet, my_tasklet_func, (unsigned long) device); // I also tried manually setting the my_tasklet fields, // rather than depending upon this function, // with the same result. // in the interrupt function: tasklet_schedule(&device->my_tasklet); void my_tasklet_func(unsigned long datum) { printk("message\n") ; } This all looks normal, right?? But when I run it, the computer locks up when tasklet_schedule() is reached!! If I create a single global tasklet struct and use tasklet_schedule(&test_tasklet); This works fine, but unfortunately I have no way to pass the required data struct to the tasklet!! So, what's wrong with this?? Is it incorrect to reference a tasklet struct in my data struct?? I used net/sundance.c from the kernel sources as reference for this, and that's what *they* do; I'm assuming, since the code is in the kernel sources, that it's working code... but maybe it's not?? -- To unsubscribe from this list: send an email with "unsubscribe kernelnewbies" to ecartis@xxxxxxxxxxxx Please read the FAQ at http://kernelnewbies.org/FAQ