Messages in this thread Patch in this message | | | Date | Wed, 21 Sep 2022 07:02:42 +0900 | Subject | Re: [PATCH RFC 2/6] scsi: scsi_transport_sas: Allocate end device target id in the rphy alloc | From | Damien Le Moal <> |
| |
On 9/20/22 19:27, John Garry wrote: > Currently the per-end device target id is allocated when adding the rphy, > which is when we execute the scan of the target. > > However it will be useful to have the target id allocated earlier when > allocating the rphy for the end device. For libata we want to move to a > scheme of allocating the sdev early in the probe process and then later > executing the scan (for that target). As such, users of would libata would > require that the target id allocated earlier here (before the scan). > > Signed-off-by: John Garry <john.garry@huawei.com> > --- > drivers/scsi/scsi_transport_sas.c | 25 +++++++++++++++++-------- > 1 file changed, 17 insertions(+), 8 deletions(-) > > diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c > index 2f88c61216ee..56d325665bc7 100644 > --- a/drivers/scsi/scsi_transport_sas.c > +++ b/drivers/scsi/scsi_transport_sas.c > @@ -1433,6 +1433,7 @@ static void sas_rphy_initialize(struct sas_rphy *rphy) > struct sas_rphy *sas_end_device_alloc(struct sas_port *parent) > { > struct Scsi_Host *shost = dev_to_shost(&parent->dev); > + struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); > struct sas_end_device *rdev; > > rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); > @@ -1455,6 +1456,10 @@ struct sas_rphy *sas_end_device_alloc(struct sas_port *parent) > sas_rphy_initialize(&rdev->rphy); > transport_setup_device(&rdev->rphy.dev); > > + mutex_lock(&sas_host->lock); > + rdev->rphy.scsi_target_id = sas_host->next_target_id++; > + mutex_unlock(&sas_host->lock); > + > return &rdev->rphy; > } > EXPORT_SYMBOL(sas_end_device_alloc); > @@ -1500,6 +1505,16 @@ struct sas_rphy *sas_expander_alloc(struct sas_port *parent, > } > EXPORT_SYMBOL(sas_expander_alloc); > > +static bool sas_rphy_end_device_valid_tproto(struct sas_rphy *rphy) > +{ > + struct sas_identify *identify = &rphy->identify; > + > + if (identify->target_port_protocols & > + (SAS_PROTOCOL_SSP | SAS_PROTOCOL_STP | SAS_PROTOCOL_SATA)) > + return true; > + return false;
You could just do:
return identify->target_port_protocols & (SAS_PROTOCOL_SSP | SAS_PROTOCOL_STP | SAS_PROTOCOL_SATA))
> +} > + > /** > * sas_rphy_add - add a SAS remote PHY to the device hierarchy > * @rphy: The remote PHY to be added > @@ -1529,16 +1544,10 @@ int sas_rphy_add(struct sas_rphy *rphy) > > mutex_lock(&sas_host->lock); > list_add_tail(&rphy->list, &sas_host->rphy_list); > - if (identify->device_type == SAS_END_DEVICE && > - (identify->target_port_protocols & > - (SAS_PROTOCOL_SSP | SAS_PROTOCOL_STP | SAS_PROTOCOL_SATA))) > - rphy->scsi_target_id = sas_host->next_target_id++; > - else if (identify->device_type == SAS_END_DEVICE) > - rphy->scsi_target_id = -1; > mutex_unlock(&sas_host->lock); > > if (identify->device_type == SAS_END_DEVICE &&
You could move this check inside sas_rphy_end_device_valid_tproto(), no ?
> - rphy->scsi_target_id != -1) { > + sas_rphy_end_device_valid_tproto(rphy)) { > int lun; > > if (identify->target_port_protocols & SAS_PROTOCOL_SSP) > @@ -1667,7 +1676,7 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel, > mutex_lock(&sas_host->lock); > list_for_each_entry(rphy, &sas_host->rphy_list, list) { > if (rphy->identify.device_type != SAS_END_DEVICE || > - rphy->scsi_target_id == -1) > + !sas_rphy_end_device_valid_tproto(rphy)) > continue; > > if ((channel == SCAN_WILD_CARD || channel == 0) &&
-- Damien Le Moal Western Digital Research
| |