Message ID | 20231229040331.52518-1-kanie@linux.alibaba.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [V2] scsi: mpi3mr: use ida to manage mrioc's id | expand |
Reviewed-by: Lee Duncan <lduncan@suse.com> On Thu, Dec 28, 2023 at 8:03 PM Guixin Liu <kanie@linux.alibaba.com> wrote: > > To ensure that the same id is not obtained during concurrent > execution of the probe, an ida is used to manage the mrioc's > id. > > Signed-off-by: Guixin Liu <kanie@linux.alibaba.com> > --- > Changes from v1 to v2: > - change id from int to u8, and use ida_alloc_range instead of ida_alloc. > > drivers/scsi/mpi3mr/mpi3mr_os.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c > index 040031eb0c12..36c4ab679094 100644 > --- a/drivers/scsi/mpi3mr/mpi3mr_os.c > +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c > @@ -8,11 +8,12 @@ > */ > > #include "mpi3mr.h" > +#include <linux/idr.h> > > /* global driver scop variables */ > LIST_HEAD(mrioc_list); > DEFINE_SPINLOCK(mrioc_list_lock); > -static int mrioc_ids; > +static DEFINE_IDA(mrioc_ida); > static int warn_non_secure_ctlr; > atomic64_t event_counter; > > @@ -5060,7 +5061,10 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) > } > > mrioc = shost_priv(shost); > - mrioc->id = mrioc_ids++; > + retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL); > + if (retval < 0) > + goto id_alloc_failed; > + mrioc->id = (u8)retval; > sprintf(mrioc->driver_name, "%s", MPI3MR_DRIVER_NAME); > sprintf(mrioc->name, "%s%d", mrioc->driver_name, mrioc->id); > INIT_LIST_HEAD(&mrioc->list); > @@ -5207,9 +5211,11 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) > resource_alloc_failed: > destroy_workqueue(mrioc->fwevt_worker_thread); > fwevtthread_failed: > + ida_free(&mrioc_ida, mrioc->id); > spin_lock(&mrioc_list_lock); > list_del(&mrioc->list); > spin_unlock(&mrioc_list_lock); > +id_alloc_failed: > scsi_host_put(shost); > shost_failed: > return retval; > @@ -5295,6 +5301,7 @@ static void mpi3mr_remove(struct pci_dev *pdev) > mrioc->sas_hba.num_phys = 0; > } > > + ida_free(&mrioc_ida, mrioc->id); > spin_lock(&mrioc_list_lock); > list_del(&mrioc->list); > spin_unlock(&mrioc_list_lock); > @@ -5502,6 +5509,7 @@ static void __exit mpi3mr_exit(void) > &driver_attr_event_counter); > pci_unregister_driver(&mpi3mr_pci_driver); > sas_release_transport(mpi3mr_transport_template); > + ida_destroy(&mrioc_ida); > } > > module_init(mpi3mr_init); > -- > 2.43.0 > >
gentle ping.. best regards, Guixin Liu 在 2023/12/29 12:03, Guixin Liu 写道: > To ensure that the same id is not obtained during concurrent > execution of the probe, an ida is used to manage the mrioc's > id. > > Signed-off-by: Guixin Liu <kanie@linux.alibaba.com> > --- > Changes from v1 to v2: > - change id from int to u8, and use ida_alloc_range instead of ida_alloc. > > drivers/scsi/mpi3mr/mpi3mr_os.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c > index 040031eb0c12..36c4ab679094 100644 > --- a/drivers/scsi/mpi3mr/mpi3mr_os.c > +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c > @@ -8,11 +8,12 @@ > */ > > #include "mpi3mr.h" > +#include <linux/idr.h> > > /* global driver scop variables */ > LIST_HEAD(mrioc_list); > DEFINE_SPINLOCK(mrioc_list_lock); > -static int mrioc_ids; > +static DEFINE_IDA(mrioc_ida); > static int warn_non_secure_ctlr; > atomic64_t event_counter; > > @@ -5060,7 +5061,10 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) > } > > mrioc = shost_priv(shost); > - mrioc->id = mrioc_ids++; > + retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL); > + if (retval < 0) > + goto id_alloc_failed; > + mrioc->id = (u8)retval; > sprintf(mrioc->driver_name, "%s", MPI3MR_DRIVER_NAME); > sprintf(mrioc->name, "%s%d", mrioc->driver_name, mrioc->id); > INIT_LIST_HEAD(&mrioc->list); > @@ -5207,9 +5211,11 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) > resource_alloc_failed: > destroy_workqueue(mrioc->fwevt_worker_thread); > fwevtthread_failed: > + ida_free(&mrioc_ida, mrioc->id); > spin_lock(&mrioc_list_lock); > list_del(&mrioc->list); > spin_unlock(&mrioc_list_lock); > +id_alloc_failed: > scsi_host_put(shost); > shost_failed: > return retval; > @@ -5295,6 +5301,7 @@ static void mpi3mr_remove(struct pci_dev *pdev) > mrioc->sas_hba.num_phys = 0; > } > > + ida_free(&mrioc_ida, mrioc->id); > spin_lock(&mrioc_list_lock); > list_del(&mrioc->list); > spin_unlock(&mrioc_list_lock); > @@ -5502,6 +5509,7 @@ static void __exit mpi3mr_exit(void) > &driver_attr_event_counter); > pci_unregister_driver(&mpi3mr_pci_driver); > sas_release_transport(mpi3mr_transport_template); > + ida_destroy(&mrioc_ida); > } > > module_init(mpi3mr_init);
friendly ping.. best regards, Guixin Liu 在 2024/1/3 10:24, Guixin Liu 写道: > gentle ping.. > > best regards, > > Guixin Liu > > 在 2023/12/29 12:03, Guixin Liu 写道: >> To ensure that the same id is not obtained during concurrent >> execution of the probe, an ida is used to manage the mrioc's >> id. >> >> Signed-off-by: Guixin Liu <kanie@linux.alibaba.com> >> --- >> Changes from v1 to v2: >> - change id from int to u8, and use ida_alloc_range instead of >> ida_alloc. >> >> drivers/scsi/mpi3mr/mpi3mr_os.c | 12 ++++++++++-- >> 1 file changed, 10 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c >> b/drivers/scsi/mpi3mr/mpi3mr_os.c >> index 040031eb0c12..36c4ab679094 100644 >> --- a/drivers/scsi/mpi3mr/mpi3mr_os.c >> +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c >> @@ -8,11 +8,12 @@ >> */ >> #include "mpi3mr.h" >> +#include <linux/idr.h> >> /* global driver scop variables */ >> LIST_HEAD(mrioc_list); >> DEFINE_SPINLOCK(mrioc_list_lock); >> -static int mrioc_ids; >> +static DEFINE_IDA(mrioc_ida); >> static int warn_non_secure_ctlr; >> atomic64_t event_counter; >> @@ -5060,7 +5061,10 @@ mpi3mr_probe(struct pci_dev *pdev, const >> struct pci_device_id *id) >> } >> mrioc = shost_priv(shost); >> - mrioc->id = mrioc_ids++; >> + retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL); >> + if (retval < 0) >> + goto id_alloc_failed; >> + mrioc->id = (u8)retval; >> sprintf(mrioc->driver_name, "%s", MPI3MR_DRIVER_NAME); >> sprintf(mrioc->name, "%s%d", mrioc->driver_name, mrioc->id); >> INIT_LIST_HEAD(&mrioc->list); >> @@ -5207,9 +5211,11 @@ mpi3mr_probe(struct pci_dev *pdev, const >> struct pci_device_id *id) >> resource_alloc_failed: >> destroy_workqueue(mrioc->fwevt_worker_thread); >> fwevtthread_failed: >> + ida_free(&mrioc_ida, mrioc->id); >> spin_lock(&mrioc_list_lock); >> list_del(&mrioc->list); >> spin_unlock(&mrioc_list_lock); >> +id_alloc_failed: >> scsi_host_put(shost); >> shost_failed: >> return retval; >> @@ -5295,6 +5301,7 @@ static void mpi3mr_remove(struct pci_dev *pdev) >> mrioc->sas_hba.num_phys = 0; >> } >> + ida_free(&mrioc_ida, mrioc->id); >> spin_lock(&mrioc_list_lock); >> list_del(&mrioc->list); >> spin_unlock(&mrioc_list_lock); >> @@ -5502,6 +5509,7 @@ static void __exit mpi3mr_exit(void) >> &driver_attr_event_counter); >> pci_unregister_driver(&mpi3mr_pci_driver); >> sas_release_transport(mpi3mr_transport_template); >> + ida_destroy(&mrioc_ida); >> } >> module_init(mpi3mr_init);
Hi guys, Friendly ping... My patch has been sent to the community for three weeks now, Could someone please review this patch? Best regards, Guixin Liu 在 2023/12/29 12:03, Guixin Liu 写道: > To ensure that the same id is not obtained during concurrent > execution of the probe, an ida is used to manage the mrioc's > id. > > Signed-off-by: Guixin Liu <kanie@linux.alibaba.com> > --- > Changes from v1 to v2: > - change id from int to u8, and use ida_alloc_range instead of ida_alloc. > > drivers/scsi/mpi3mr/mpi3mr_os.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c > index 040031eb0c12..36c4ab679094 100644 > --- a/drivers/scsi/mpi3mr/mpi3mr_os.c > +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c > @@ -8,11 +8,12 @@ > */ > > #include "mpi3mr.h" > +#include <linux/idr.h> > > /* global driver scop variables */ > LIST_HEAD(mrioc_list); > DEFINE_SPINLOCK(mrioc_list_lock); > -static int mrioc_ids; > +static DEFINE_IDA(mrioc_ida); > static int warn_non_secure_ctlr; > atomic64_t event_counter; > > @@ -5060,7 +5061,10 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) > } > > mrioc = shost_priv(shost); > - mrioc->id = mrioc_ids++; > + retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL); > + if (retval < 0) > + goto id_alloc_failed; > + mrioc->id = (u8)retval; > sprintf(mrioc->driver_name, "%s", MPI3MR_DRIVER_NAME); > sprintf(mrioc->name, "%s%d", mrioc->driver_name, mrioc->id); > INIT_LIST_HEAD(&mrioc->list); > @@ -5207,9 +5211,11 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) > resource_alloc_failed: > destroy_workqueue(mrioc->fwevt_worker_thread); > fwevtthread_failed: > + ida_free(&mrioc_ida, mrioc->id); > spin_lock(&mrioc_list_lock); > list_del(&mrioc->list); > spin_unlock(&mrioc_list_lock); > +id_alloc_failed: > scsi_host_put(shost); > shost_failed: > return retval; > @@ -5295,6 +5301,7 @@ static void mpi3mr_remove(struct pci_dev *pdev) > mrioc->sas_hba.num_phys = 0; > } > > + ida_free(&mrioc_ida, mrioc->id); > spin_lock(&mrioc_list_lock); > list_del(&mrioc->list); > spin_unlock(&mrioc_list_lock); > @@ -5502,6 +5509,7 @@ static void __exit mpi3mr_exit(void) > &driver_attr_event_counter); > pci_unregister_driver(&mpi3mr_pci_driver); > sas_release_transport(mpi3mr_transport_template); > + ida_destroy(&mrioc_ida); > } > > module_init(mpi3mr_init);
On Fri, 2023-12-29 at 12:03 +0800, Guixin Liu wrote: > To ensure that the same id is not obtained during concurrent > execution of the probe, an ida is used to manage the mrioc's > id. > > Signed-off-by: Guixin Liu <kanie@linux.alibaba.com> > --- > Changes from v1 to v2: > - change id from int to u8, and use ida_alloc_range instead of > ida_alloc. > > drivers/scsi/mpi3mr/mpi3mr_os.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > Reviewed-by: Martin Wilck <mwilck@suse.com>
Guixin, > To ensure that the same id is not obtained during concurrent execution > of the probe, an ida is used to manage the mrioc's id. Applied to 6.9/scsi-staging, thanks!
On Fri, 29 Dec 2023 12:03:31 +0800, Guixin Liu wrote: > To ensure that the same id is not obtained during concurrent > execution of the probe, an ida is used to manage the mrioc's > id. > > Applied to 6.9/scsi-queue, thanks! [1/1] scsi: mpi3mr: use ida to manage mrioc's id https://git.kernel.org/mkp/scsi/c/29b75184f721
diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index 040031eb0c12..36c4ab679094 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -8,11 +8,12 @@ */ #include "mpi3mr.h" +#include <linux/idr.h> /* global driver scop variables */ LIST_HEAD(mrioc_list); DEFINE_SPINLOCK(mrioc_list_lock); -static int mrioc_ids; +static DEFINE_IDA(mrioc_ida); static int warn_non_secure_ctlr; atomic64_t event_counter; @@ -5060,7 +5061,10 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) } mrioc = shost_priv(shost); - mrioc->id = mrioc_ids++; + retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL); + if (retval < 0) + goto id_alloc_failed; + mrioc->id = (u8)retval; sprintf(mrioc->driver_name, "%s", MPI3MR_DRIVER_NAME); sprintf(mrioc->name, "%s%d", mrioc->driver_name, mrioc->id); INIT_LIST_HEAD(&mrioc->list); @@ -5207,9 +5211,11 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) resource_alloc_failed: destroy_workqueue(mrioc->fwevt_worker_thread); fwevtthread_failed: + ida_free(&mrioc_ida, mrioc->id); spin_lock(&mrioc_list_lock); list_del(&mrioc->list); spin_unlock(&mrioc_list_lock); +id_alloc_failed: scsi_host_put(shost); shost_failed: return retval; @@ -5295,6 +5301,7 @@ static void mpi3mr_remove(struct pci_dev *pdev) mrioc->sas_hba.num_phys = 0; } + ida_free(&mrioc_ida, mrioc->id); spin_lock(&mrioc_list_lock); list_del(&mrioc->list); spin_unlock(&mrioc_list_lock); @@ -5502,6 +5509,7 @@ static void __exit mpi3mr_exit(void) &driver_attr_event_counter); pci_unregister_driver(&mpi3mr_pci_driver); sas_release_transport(mpi3mr_transport_template); + ida_destroy(&mrioc_ida); } module_init(mpi3mr_init);
To ensure that the same id is not obtained during concurrent execution of the probe, an ida is used to manage the mrioc's id. Signed-off-by: Guixin Liu <kanie@linux.alibaba.com> --- Changes from v1 to v2: - change id from int to u8, and use ida_alloc_range instead of ida_alloc. drivers/scsi/mpi3mr/mpi3mr_os.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)