summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Ott <sebott@linux.vnet.ibm.com>2016-07-19 10:43:26 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2016-07-31 05:27:57 -0400
commit837c5220557270e652d89f68a9fb12a5e72e8a7a (patch)
treeab60a16d9c19efc26e5a9253bcf96703cd1b65b7
parentbc29b7ac1d9f09f5024b0e257e91bf5df611ccd4 (diff)
downloadlinux-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.c18
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)