On Fri, Feb 17, 2006 at 04:42:43PM -0800, James Bottomley wrote: > +static void execute_in_process_context_work(void *data) > +{ > + void (*fn)(void *data); > + struct execute_work *ew = data; > + > + fn = ew->fn; > + data = ew->data; > + > + fn(data); > +} After removing kfree(), which was here in the initial implementation, this function became a thunk which does nothing useful - we can just stick fn and data directly into work_struct. > + > +/** > + * execute_in_process_context - reliably execute the routine with user context > + * @fn: the function to execute > + * @data: data to pass to the function > + * > + * Executes the function immediately if process context is available, > + * otherwise schedules the function for delayed execution. > + * > + * Returns: 0 - function was executed > + * 1 - function was scheduled for execution > + */ > +int execute_in_process_context(void (*fn)(void *data), void *data, > + struct execute_work *ew) > +{ > + if (!in_interrupt()) { > + fn(data); > + return 0; > + } > + > + INIT_WORK(&ew->work, execute_in_process_context_work, ew); > + ew->fn = fn; > + ew->data = data; > + schedule_work(&ew->work); > + > + return 1; > +} Then this becomes: int execute_in_process_context(void (*fn)(void *data), void *data, struct work_struct *work) { if (!in_interrupt()) { fn(data); return 0; } INIT_WORK(work, fn, data); schedule_work(work); return 1; } (and struct execute_work is no longer needed).
Attachment:
pgpZb21Lo4UwG.pgp
Description: PGP signature