dm stripe: switch from local workqueue to system_wq
kstriped only serves sc->kstriped_ws which runs dm_table_event(). This doesn't need to be executed from an ordered workqueue w/ rescuer. Drop kstriped and use the system_wq instead. While at it, rename kstriped_ws to trigger_event so that it's consistent with other dm modules. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
This commit is contained in:
parent
d5ffa387e2
commit
f521f074ab
1 changed files with 7 additions and 20 deletions
|
@ -39,23 +39,20 @@ struct stripe_c {
|
||||||
struct dm_target *ti;
|
struct dm_target *ti;
|
||||||
|
|
||||||
/* Work struct used for triggering events*/
|
/* Work struct used for triggering events*/
|
||||||
struct work_struct kstriped_ws;
|
struct work_struct trigger_event;
|
||||||
|
|
||||||
struct stripe stripe[0];
|
struct stripe stripe[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct workqueue_struct *kstriped;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* An event is triggered whenever a drive
|
* An event is triggered whenever a drive
|
||||||
* drops out of a stripe volume.
|
* drops out of a stripe volume.
|
||||||
*/
|
*/
|
||||||
static void trigger_event(struct work_struct *work)
|
static void trigger_event(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct stripe_c *sc = container_of(work, struct stripe_c, kstriped_ws);
|
struct stripe_c *sc = container_of(work, struct stripe_c,
|
||||||
|
trigger_event);
|
||||||
dm_table_event(sc->ti->table);
|
dm_table_event(sc->ti->table);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct stripe_c *alloc_context(unsigned int stripes)
|
static inline struct stripe_c *alloc_context(unsigned int stripes)
|
||||||
|
@ -160,7 +157,7 @@ static int stripe_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT_WORK(&sc->kstriped_ws, trigger_event);
|
INIT_WORK(&sc->trigger_event, trigger_event);
|
||||||
|
|
||||||
/* Set pointer to dm target; used in trigger_event */
|
/* Set pointer to dm target; used in trigger_event */
|
||||||
sc->ti = ti;
|
sc->ti = ti;
|
||||||
|
@ -211,7 +208,7 @@ static void stripe_dtr(struct dm_target *ti)
|
||||||
for (i = 0; i < sc->stripes; i++)
|
for (i = 0; i < sc->stripes; i++)
|
||||||
dm_put_device(ti, sc->stripe[i].dev);
|
dm_put_device(ti, sc->stripe[i].dev);
|
||||||
|
|
||||||
flush_workqueue(kstriped);
|
flush_work_sync(&sc->trigger_event);
|
||||||
kfree(sc);
|
kfree(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -367,7 +364,7 @@ static int stripe_end_io(struct dm_target *ti, struct bio *bio,
|
||||||
atomic_inc(&(sc->stripe[i].error_count));
|
atomic_inc(&(sc->stripe[i].error_count));
|
||||||
if (atomic_read(&(sc->stripe[i].error_count)) <
|
if (atomic_read(&(sc->stripe[i].error_count)) <
|
||||||
DM_IO_ERROR_THRESHOLD)
|
DM_IO_ERROR_THRESHOLD)
|
||||||
queue_work(kstriped, &sc->kstriped_ws);
|
schedule_work(&sc->trigger_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
|
@ -401,7 +398,7 @@ static void stripe_io_hints(struct dm_target *ti,
|
||||||
|
|
||||||
static struct target_type stripe_target = {
|
static struct target_type stripe_target = {
|
||||||
.name = "striped",
|
.name = "striped",
|
||||||
.version = {1, 3, 0},
|
.version = {1, 3, 1},
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.ctr = stripe_ctr,
|
.ctr = stripe_ctr,
|
||||||
.dtr = stripe_dtr,
|
.dtr = stripe_dtr,
|
||||||
|
@ -422,20 +419,10 @@ int __init dm_stripe_init(void)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
kstriped = create_singlethread_workqueue("kstriped");
|
|
||||||
if (!kstriped) {
|
|
||||||
DMERR("failed to create workqueue kstriped");
|
|
||||||
dm_unregister_target(&stripe_target);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dm_stripe_exit(void)
|
void dm_stripe_exit(void)
|
||||||
{
|
{
|
||||||
dm_unregister_target(&stripe_target);
|
dm_unregister_target(&stripe_target);
|
||||||
destroy_workqueue(kstriped);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue