I am submitting this patch which converts instances of tasklets in drivers/scsi/* to bottom half workqueues. I appreciate your feedback and suggestion on the changes. Note: The patch is only compile tested. In the patcheset, you will notice *FIXME* in two places: 1. pm8001/pm8001_init.c @ pm8001_work(struct work_struct *t) 2. pmcraid.c @ pmcraid_work_function(struct work_struct *t) The current implementation limits context-aware processing within work functions due to the lack of a mechanism to identify the source work_struct in the array. The proposed solution wraps each work_struct with a struct work_wrapper, adding crucial context like the array index and a reference to the parent data structure. Ex: #define SOME_CONSTANT 10 struct xxx_data { ..... struct work_struct work[SOME_CONSTANT]: ..... }; The xxx_data module currently uses an array of work_structs for scheduling work, but it lacks the ability to identify which array element is associated with a specific invocation of the work function. This limitation prevents the execution of context-specific actions based on the source of the work request. The proposed solution is to introduce a struct work_wrapper that encapsulates each work_struct along with additional metadata, including an index and a pointer to the parent xxx_data structure. This enhancement allows the work function to access necessary context information. Changes: 1. Definition of struct work_wrapper: struct work_wrapper { struct work_struct work; struct xxx_data *data; int index; }; struct xxx_data { struct work_wrapper work[SOME_CONSTANT]; }; During initialization: for (int i = 0; i < SOME_CONSTANT; i++) { p->work[i].data = p; p->work[i].index = i; INIT_WORK(&p->work[i].work, work_func); } And it's usage in the handler: void work_func(struct work_struct *t) { struct work_wrapper *wrapper = from_work(wrapper, t, work); struct xxx_data *a = wrapper->data; int index = wrapper->index; .... } If the above is solution is acceptable, I can have the same incorporated in version 2. Thanks. Allen Pais (1): [RFC] scsi: Convert from tasklet to BH workqueue drivers/scsi/aic7xxx/aic7xxx_osm.c | 2 +- drivers/scsi/aic94xx/aic94xx_hwi.c | 14 ++-- drivers/scsi/aic94xx/aic94xx_hwi.h | 5 +- drivers/scsi/aic94xx/aic94xx_scb.c | 36 +++++----- drivers/scsi/aic94xx/aic94xx_task.c | 14 ++-- drivers/scsi/aic94xx/aic94xx_tmf.c | 34 +++++----- drivers/scsi/esas2r/esas2r.h | 12 ++-- drivers/scsi/esas2r/esas2r_init.c | 14 ++-- drivers/scsi/esas2r/esas2r_int.c | 18 ++--- drivers/scsi/esas2r/esas2r_io.c | 2 +- drivers/scsi/esas2r/esas2r_main.c | 16 ++--- drivers/scsi/ibmvscsi/ibmvfc.c | 16 ++--- drivers/scsi/ibmvscsi/ibmvfc.h | 3 +- drivers/scsi/ibmvscsi/ibmvscsi.c | 16 ++--- drivers/scsi/ibmvscsi/ibmvscsi.h | 3 +- drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c | 15 ++--- drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.h | 3 +- drivers/scsi/isci/host.c | 12 ++-- drivers/scsi/isci/host.h | 8 +-- drivers/scsi/isci/init.c | 4 +- drivers/scsi/megaraid/mega_common.h | 5 +- drivers/scsi/megaraid/megaraid_mbox.c | 21 +++--- drivers/scsi/megaraid/megaraid_sas.h | 4 +- drivers/scsi/megaraid/megaraid_sas_base.c | 32 +++++---- drivers/scsi/megaraid/megaraid_sas_fusion.c | 16 ++--- drivers/scsi/mvsas/mv_init.c | 27 ++++---- drivers/scsi/mvsas/mv_sas.h | 9 +-- drivers/scsi/pm8001/pm8001_init.c | 57 ++++++++-------- drivers/scsi/pm8001/pm8001_sas.h | 2 +- drivers/scsi/pmcraid.c | 75 ++++++++++----------- drivers/scsi/pmcraid.h | 5 +- 31 files changed, 249 insertions(+), 251 deletions(-) -- 2.17.1