diff options
author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2016-07-19 10:43:26 +0200 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-07-31 05:27:57 -0400 |
commit | 837c5220557270e652d89f68a9fb12a5e72e8a7a (patch) | |
tree | ab60a16d9c19efc26e5a9253bcf96703cd1b65b7 | |
parent | bc29b7ac1d9f09f5024b0e257e91bf5df611ccd4 (diff) | |
download | linux-837c5220557270e652d89f68a9fb12a5e72e8a7a.tar.bz2 |
s390/cio: convert cfg_lock mutex to spinlock
cfg_lock is never held long and we don't want to sleep while the
lock is being held. Thus it can be converted to a simple spinlock.
In addition we can now use the lock during the evaluation of a
wake_up condition.
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r-- | drivers/s390/cio/chp.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/s390/cio/chp.c b/drivers/s390/cio/chp.c index e96aced58627..c602211ab94e 100644 --- a/drivers/s390/cio/chp.c +++ b/drivers/s390/cio/chp.c @@ -37,7 +37,7 @@ enum cfg_task_t { /* Map for pending configure tasks. */ static enum cfg_task_t chp_cfg_task[__MAX_CSSID + 1][__MAX_CHPID + 1]; -static DEFINE_MUTEX(cfg_lock); +static DEFINE_SPINLOCK(cfg_lock); static int cfg_busy; /* Map for channel-path status. */ @@ -674,7 +674,7 @@ static void cfg_func(struct work_struct *work) enum cfg_task_t t; int rc; - mutex_lock(&cfg_lock); + spin_lock(&cfg_lock); t = cfg_none; chp_id_for_each(&chpid) { t = cfg_get_task(chpid); @@ -683,7 +683,7 @@ static void cfg_func(struct work_struct *work) break; } } - mutex_unlock(&cfg_lock); + spin_unlock(&cfg_lock); switch (t) { case cfg_configure: @@ -709,9 +709,9 @@ static void cfg_func(struct work_struct *work) case cfg_none: /* Get updated information after last change. */ info_update(); - mutex_lock(&cfg_lock); + spin_lock(&cfg_lock); cfg_busy = 0; - mutex_unlock(&cfg_lock); + spin_unlock(&cfg_lock); wake_up_interruptible(&cfg_wait_queue); return; } @@ -729,10 +729,10 @@ void chp_cfg_schedule(struct chp_id chpid, int configure) { CIO_MSG_EVENT(2, "chp_cfg_sched%x.%02x=%d\n", chpid.cssid, chpid.id, configure); - mutex_lock(&cfg_lock); + spin_lock(&cfg_lock); cfg_set_task(chpid, configure ? cfg_configure : cfg_deconfigure); cfg_busy = 1; - mutex_unlock(&cfg_lock); + spin_unlock(&cfg_lock); schedule_work(&cfg_work); } @@ -746,10 +746,10 @@ void chp_cfg_schedule(struct chp_id chpid, int configure) void chp_cfg_cancel_deconfigure(struct chp_id chpid) { CIO_MSG_EVENT(2, "chp_cfg_cancel:%x.%02x\n", chpid.cssid, chpid.id); - mutex_lock(&cfg_lock); + spin_lock(&cfg_lock); if (cfg_get_task(chpid) == cfg_deconfigure) cfg_set_task(chpid, cfg_none); - mutex_unlock(&cfg_lock); + spin_unlock(&cfg_lock); } static int cfg_wait_idle(void) |