]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: libata-core: Reuse available ata_port print_ids
authorNiklas Cassel <cassel@kernel.org>
Wed, 3 Jul 2024 18:44:24 +0000 (20:44 +0200)
committerNiklas Cassel <cassel@kernel.org>
Thu, 4 Jul 2024 09:52:32 +0000 (11:52 +0200)
Currently, the ata_port print_ids are increased indefinitely, even when
there are lower ids available.

E.g. on first boot you will have ata1-ata6 assigned.
After a rmmod + modprobe, you will instead have ata7-ata12 assigned.

Move to use the ida_alloc() API, such that print_ids will get reused.
This means that even after a rmmod + modprobe, the ports will be assigned
print_ids ata1-ata6.

Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20240703184418.723066-18-cassel@kernel.org
Signed-off-by: Niklas Cassel <cassel@kernel.org>
drivers/ata/libata-core.c

index da7c141b1f2eb084c20c5c56498ed3ee971f258e..02c3b8a22417e727c1ed979b9a2b2fa34f0c68a2 100644 (file)
@@ -86,7 +86,7 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev);
 static void ata_dev_xfermask(struct ata_device *dev);
 static unsigned long ata_dev_blacklisted(const struct ata_device *dev);
 
-atomic_t ata_print_id = ATOMIC_INIT(0);
+static DEFINE_IDA(ata_ida);
 
 #ifdef CONFIG_ATA_FORCE
 struct ata_force_param {
@@ -5463,6 +5463,7 @@ int sata_link_init_spd(struct ata_link *link)
 struct ata_port *ata_port_alloc(struct ata_host *host)
 {
        struct ata_port *ap;
+       int id;
 
        ap = kzalloc(sizeof(*ap), GFP_KERNEL);
        if (!ap)
@@ -5470,7 +5471,12 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
 
        ap->pflags |= ATA_PFLAG_INITIALIZING | ATA_PFLAG_FROZEN;
        ap->lock = &host->lock;
-       ap->print_id = atomic_inc_return(&ata_print_id);
+       id = ida_alloc_min(&ata_ida, 1, GFP_KERNEL);
+       if (id < 0) {
+               kfree(ap);
+               return NULL;
+       }
+       ap->print_id = id;
        ap->host = host;
        ap->dev = host->dev;
 
@@ -5504,6 +5510,7 @@ void ata_port_free(struct ata_port *ap)
        kfree(ap->pmp_link);
        kfree(ap->slave_link);
        kfree(ap->ncq_sense_buf);
+       ida_free(&ata_ida, ap->print_id);
        kfree(ap);
 }
 EXPORT_SYMBOL_GPL(ata_port_free);