On Monday, April 26, 2021 9:21:01 PM CEST Matthew Wilcox wrote: > On Mon, Apr 26, 2021 at 08:42:45PM +0200, Fabio M. De Francesco wrote: > > +static void setup_scsitaskmgmt_handles(struct xarray *xa, struct uiscmdrsp *cmdrsp, > > > > wait_queue_head_t *event, int *result) > > > > { > > > > - /* specify the event that has to be triggered when this */ > > - /* cmd is complete */ > > - cmdrsp->scsitaskmgmt.notify_handle = > > - simple_idr_get(idrtable, event, lock); > > - cmdrsp->scsitaskmgmt.notifyresult_handle = > > - simple_idr_get(idrtable, result, lock); > > + u32 id; > > + int ret; > > + > > + /* specify the event that has to be triggered when this cmd is complete */ > > + id = (u32)cmdrsp->scsitaskmgmt.notify_handle; > > + ret = xa_alloc_irq(xa, &id, event, XA_LIMIT(1, INT_MAX), GFP_KERNEL); > > OK, think this one through a bit. When xa_alloc_irq() stores the ID that > it assigned into 'id', what happens to it next? > Oh, I overlooked that... The ID in 'id' is lost when the function exits and the stack frame is unwound. Now I have another problem: xa_alloc_irq() writes id u32* but I have an u64* in 'id'. What happens if I cast 'id' to an u32* when passing it to xa_alloc_irq()? u64 *id; int ret; id = &cmdrsp->scsitaskmgmt.notify_handle; ret = xa_alloc_irq(xa, (u32 *)id, event, XA_LIMIT(1, INT_MAX), GFP_KERNEL); Do I destroy the information stored in 'id' with that cast? > > > + id = (u32)cmdrsp->scsitaskmgmt.notifyresult_handle; > > + ret = xa_alloc_irq(xa, &id, result, XA_LIMIT(1, INT_MAX), GFP_KERNEL); > > > > } > > > > @@ -1053,8 +1018,6 @@ static int visorhba_probe(struct visor_device *dev) > > > > if (err) > > > > goto err_debugfs_info; > > > > - idr_init(&devdata->idr); > > You still need to initialise the XArray, either with xa_init() or by > using DEFINE_XARRAY. Since it's dynamically allocated, the former is > correct. > I had read that XArray must be initialized with xa_init(). However, when I deleted the line with the initialization of the IDR, I forgot to replace it with a statement that uses xa_init(). Thanks, Fabio