Skip to content

Commit

Permalink
mmc_sim: fix setting of the mutex name
Browse files Browse the repository at this point in the history
To quote the manual:
 The pointer passed in as name and type is saved rather than the data
 it points to.  The data pointed to must remain stable until the mutex
 is destroyed.

It seems that the type is actually copied, but the name is stored as
a pointer indeed.
mmc_cam_sim_alloc used a name stored on stack.
So, a corrupt mutex name would be reported.
For example:
  lock order reversal: (sleepable after non-sleepable)
  1st 0xd7285b20 <8A><C0><C0>P@<C1><D0>P@<C1>^D^A (aw_mmc_sim, sleep mutex) @ sys/cam/cam_xpt.c:2804

This change moves the name to struct mmc_sim.
Also, that name is used as the sim name as well.
Unused mtx_name variable is removed too.
The name buffer is reduced to 16 characters.

(cherry picked from commit 18679ab)
(cherry picked from commit 8eca341)
  • Loading branch information
avg-I committed Dec 25, 2021
1 parent 6cccfea commit a8915e4
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 6 deletions.
9 changes: 3 additions & 6 deletions sys/cam/mmc/mmc_sim.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,21 +191,18 @@ mmc_cam_sim_default_action(struct cam_sim *sim, union ccb *ccb)
int
mmc_cam_sim_alloc(device_t dev, const char *name, struct mmc_sim *mmc_sim)
{
char sim_name[64], mtx_name[64];

mmc_sim->dev = dev;

if ((mmc_sim->devq = cam_simq_alloc(1)) == NULL) {
goto fail;
}

snprintf(sim_name, sizeof(sim_name), "%s_sim", name);
snprintf(mtx_name, sizeof(mtx_name), "%s_mtx", name);

mtx_init(&mmc_sim->mtx, sim_name, NULL, MTX_DEF);
snprintf(mmc_sim->name, sizeof(mmc_sim->name), "%s_sim", name);
mtx_init(&mmc_sim->mtx, mmc_sim->name, NULL, MTX_DEF);
mmc_sim->sim = cam_sim_alloc_dev(mmc_cam_sim_default_action,
mmc_cam_default_poll,
name, mmc_sim, dev,
mmc_sim->name, mmc_sim, dev,
&mmc_sim->mtx, 1, 1, mmc_sim->devq);

if (mmc_sim->sim == NULL) {
Expand Down
1 change: 1 addition & 0 deletions sys/cam/mmc/mmc_sim.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
struct mmc_sim {
struct mmc_cam_sim_softc *sc;
struct mtx mtx;
char name[16];
struct cam_devq *devq;
struct cam_sim *sim;
device_t dev;
Expand Down

0 comments on commit a8915e4

Please sign in to comment.