2010/10/22 Alan Cox <alan@xxxxxxxxxxxxxxxxxxx>: >> + >> +/** >> + * create_work_item() - Create work item and add it to the work queue. >> + * @wq: work queue struct where the work will be added. >> + * @work_func: Work function. >> + * @data: Private data for the work. >> + * >> + * Returns: >> + * 0 if there is no error. >> + * -EBUSY if not possible to queue work. >> + * -ENOMEM if allocation fails. >> + */ >> +static int create_work_item(struct workqueue_struct *wq, work_func_t work_func, >> + void *data) >> +{ >> + struct uart_work_struct *new_work; >> + int err; >> + >> + new_work = kmalloc(sizeof(*new_work), GFP_ATOMIC); > > So instead of a tiny object embedded in your device you've got a whole > error path to worry about, a printk disguised in a macro and a text > string longer than the struct size ? Surely this should be part of the > device > I've tried now to use 3 separate work_structs in the device (one for each work function used), but this doesn't work out. The reason is that the work is generated so often that a work is not finished before next work of same type comes. This is especially true for transmit and receive. Then I get 0 back when queuing the work and there is no real way to solve it from what I can see than to allocate new work structures every time. /P-G -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html