diff options
-rw-r--r-- | drivers/s390/cio/blacklist.c | 2 | ||||
-rw-r--r-- | drivers/s390/cio/css.c | 13 | ||||
-rw-r--r-- | drivers/s390/cio/css.h | 1 |
3 files changed, 9 insertions, 7 deletions
diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index a9fe3de2dec1..77ee4daec206 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c | |||
@@ -269,7 +269,7 @@ static int blacklist_parse_proc_parameters(char *buf) | |||
269 | else | 269 | else |
270 | return -EINVAL; | 270 | return -EINVAL; |
271 | 271 | ||
272 | css_schedule_reprobe(); | 272 | css_schedule_eval_all_unreg(0); |
273 | 273 | ||
274 | return rc; | 274 | return rc; |
275 | } | 275 | } |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index c1f9cc728c2d..604333ebf01e 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -575,7 +575,7 @@ static void css_slow_path_func(struct work_struct *unused) | |||
575 | spin_unlock_irqrestore(&slow_subchannel_lock, flags); | 575 | spin_unlock_irqrestore(&slow_subchannel_lock, flags); |
576 | } | 576 | } |
577 | 577 | ||
578 | static DECLARE_WORK(slow_path_work, css_slow_path_func); | 578 | static DECLARE_DELAYED_WORK(slow_path_work, css_slow_path_func); |
579 | struct workqueue_struct *cio_work_q; | 579 | struct workqueue_struct *cio_work_q; |
580 | 580 | ||
581 | void css_schedule_eval(struct subchannel_id schid) | 581 | void css_schedule_eval(struct subchannel_id schid) |
@@ -585,7 +585,7 @@ void css_schedule_eval(struct subchannel_id schid) | |||
585 | spin_lock_irqsave(&slow_subchannel_lock, flags); | 585 | spin_lock_irqsave(&slow_subchannel_lock, flags); |
586 | idset_sch_add(slow_subchannel_set, schid); | 586 | idset_sch_add(slow_subchannel_set, schid); |
587 | atomic_set(&css_eval_scheduled, 1); | 587 | atomic_set(&css_eval_scheduled, 1); |
588 | queue_work(cio_work_q, &slow_path_work); | 588 | queue_delayed_work(cio_work_q, &slow_path_work, 0); |
589 | spin_unlock_irqrestore(&slow_subchannel_lock, flags); | 589 | spin_unlock_irqrestore(&slow_subchannel_lock, flags); |
590 | } | 590 | } |
591 | 591 | ||
@@ -596,7 +596,7 @@ void css_schedule_eval_all(void) | |||
596 | spin_lock_irqsave(&slow_subchannel_lock, flags); | 596 | spin_lock_irqsave(&slow_subchannel_lock, flags); |
597 | idset_fill(slow_subchannel_set); | 597 | idset_fill(slow_subchannel_set); |
598 | atomic_set(&css_eval_scheduled, 1); | 598 | atomic_set(&css_eval_scheduled, 1); |
599 | queue_work(cio_work_q, &slow_path_work); | 599 | queue_delayed_work(cio_work_q, &slow_path_work, 0); |
600 | spin_unlock_irqrestore(&slow_subchannel_lock, flags); | 600 | spin_unlock_irqrestore(&slow_subchannel_lock, flags); |
601 | } | 601 | } |
602 | 602 | ||
@@ -609,7 +609,7 @@ static int __unset_registered(struct device *dev, void *data) | |||
609 | return 0; | 609 | return 0; |
610 | } | 610 | } |
611 | 611 | ||
612 | static void css_schedule_eval_all_unreg(void) | 612 | void css_schedule_eval_all_unreg(unsigned long delay) |
613 | { | 613 | { |
614 | unsigned long flags; | 614 | unsigned long flags; |
615 | struct idset *unreg_set; | 615 | struct idset *unreg_set; |
@@ -627,7 +627,7 @@ static void css_schedule_eval_all_unreg(void) | |||
627 | spin_lock_irqsave(&slow_subchannel_lock, flags); | 627 | spin_lock_irqsave(&slow_subchannel_lock, flags); |
628 | idset_add_set(slow_subchannel_set, unreg_set); | 628 | idset_add_set(slow_subchannel_set, unreg_set); |
629 | atomic_set(&css_eval_scheduled, 1); | 629 | atomic_set(&css_eval_scheduled, 1); |
630 | queue_work(cio_work_q, &slow_path_work); | 630 | queue_delayed_work(cio_work_q, &slow_path_work, delay); |
631 | spin_unlock_irqrestore(&slow_subchannel_lock, flags); | 631 | spin_unlock_irqrestore(&slow_subchannel_lock, flags); |
632 | idset_free(unreg_set); | 632 | idset_free(unreg_set); |
633 | } | 633 | } |
@@ -640,7 +640,8 @@ void css_wait_for_slow_path(void) | |||
640 | /* Schedule reprobing of all unregistered subchannels. */ | 640 | /* Schedule reprobing of all unregistered subchannels. */ |
641 | void css_schedule_reprobe(void) | 641 | void css_schedule_reprobe(void) |
642 | { | 642 | { |
643 | css_schedule_eval_all_unreg(); | 643 | /* Schedule with a delay to allow merging of subsequent calls. */ |
644 | css_schedule_eval_all_unreg(1 * HZ); | ||
644 | } | 645 | } |
645 | EXPORT_SYMBOL_GPL(css_schedule_reprobe); | 646 | EXPORT_SYMBOL_GPL(css_schedule_reprobe); |
646 | 647 | ||
diff --git a/drivers/s390/cio/css.h b/drivers/s390/cio/css.h index 29351321bad6..2c9107e20251 100644 --- a/drivers/s390/cio/css.h +++ b/drivers/s390/cio/css.h | |||
@@ -133,6 +133,7 @@ extern struct channel_subsystem *channel_subsystems[]; | |||
133 | /* Helper functions to build lists for the slow path. */ | 133 | /* Helper functions to build lists for the slow path. */ |
134 | void css_schedule_eval(struct subchannel_id schid); | 134 | void css_schedule_eval(struct subchannel_id schid); |
135 | void css_schedule_eval_all(void); | 135 | void css_schedule_eval_all(void); |
136 | void css_schedule_eval_all_unreg(unsigned long delay); | ||
136 | int css_complete_work(void); | 137 | int css_complete_work(void); |
137 | 138 | ||
138 | int sch_is_pseudo_sch(struct subchannel *); | 139 | int sch_is_pseudo_sch(struct subchannel *); |