Skip to content

Commit

Permalink
fsi: Prevent multiple concurrent rescans
Browse files Browse the repository at this point in the history
The bus scanning process isn't terribly good at parallel attempts
at rescanning the same bus. Let's have a per-master mutex protecting
the scanning process.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Benjamin Herrenschmidt committed Jul 26, 2018
1 parent d1dcd67 commit 9840fcd
Showing 2 changed files with 16 additions and 2 deletions.
16 changes: 14 additions & 2 deletions drivers/fsi/fsi-core.c
Original file line number Diff line number Diff line change
@@ -1203,8 +1203,14 @@ static void fsi_master_unscan(struct fsi_master *master)

int fsi_master_rescan(struct fsi_master *master)
{
int rc;

mutex_lock(&master->scan_lock);
fsi_master_unscan(master);
return fsi_master_scan(master);
rc = fsi_master_scan(master);
mutex_unlock(&master->scan_lock);

return rc;
}
EXPORT_SYMBOL_GPL(fsi_master_rescan);

@@ -1240,6 +1246,7 @@ int fsi_master_register(struct fsi_master *master)
int rc;
struct device_node *np;

mutex_init(&master->scan_lock);
master->idx = ida_simple_get(&master_ida, 0, INT_MAX, GFP_KERNEL);
dev_set_name(&master->dev, "fsi%d", master->idx);

@@ -1264,8 +1271,11 @@ int fsi_master_register(struct fsi_master *master)
}

np = dev_of_node(&master->dev);
if (!of_property_read_bool(np, "no-scan-on-init"))
if (!of_property_read_bool(np, "no-scan-on-init")) {
mutex_lock(&master->scan_lock);
fsi_master_scan(master);
mutex_unlock(&master->scan_lock);
}

return 0;
}
@@ -1278,7 +1288,9 @@ void fsi_master_unregister(struct fsi_master *master)
master->idx = -1;
}

mutex_lock(&master->scan_lock);
fsi_master_unscan(master);
mutex_unlock(&master->scan_lock);
device_unregister(&master->dev);
}
EXPORT_SYMBOL_GPL(fsi_master_unregister);
2 changes: 2 additions & 0 deletions drivers/fsi/fsi-master.h
Original file line number Diff line number Diff line change
@@ -18,6 +18,7 @@
#define DRIVERS_FSI_MASTER_H

#include <linux/device.h>
#include <linux/mutex.h>

/* Various protocol delays */
#define FSI_ECHO_DELAY_CLOCKS 16 /* Number clocks for echo delay */
@@ -59,6 +60,7 @@ struct fsi_master {
int idx;
int n_links;
int flags;
struct mutex scan_lock;
int (*read)(struct fsi_master *, int link, uint8_t id,
uint32_t addr, void *val, size_t size);
int (*write)(struct fsi_master *, int link, uint8_t id,

0 comments on commit 9840fcd

Please sign in to comment.