diff options
Diffstat (limited to 'drivers/s390/cio/css.c')
| -rw-r--r-- | drivers/s390/cio/css.c | 40 | 
1 files changed, 31 insertions, 9 deletions
| diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 3377097e65de..44461928aab8 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c @@ -788,27 +788,49 @@ static int __unset_registered(struct device *dev, void *data)  	return 0;  } -void css_schedule_eval_all_unreg(unsigned long delay) +static int __unset_online(struct device *dev, void *data) +{ +	struct idset *set = data; +	struct subchannel *sch = to_subchannel(dev); +	struct ccw_device *cdev = sch_get_cdev(sch); + +	if (cdev && cdev->online) +		idset_sch_del(set, sch->schid); + +	return 0; +} + +void css_schedule_eval_cond(enum css_eval_cond cond, unsigned long delay)  {  	unsigned long flags; -	struct idset *unreg_set; +	struct idset *set;  	/* Find unregistered subchannels. */ -	unreg_set = idset_sch_new(); -	if (!unreg_set) { +	set = idset_sch_new(); +	if (!set) {  		/* Fallback. */  		css_schedule_eval_all();  		return;  	} -	idset_fill(unreg_set); -	bus_for_each_dev(&css_bus_type, NULL, unreg_set, __unset_registered); +	idset_fill(set); +	switch (cond) { +	case CSS_EVAL_UNREG: +		bus_for_each_dev(&css_bus_type, NULL, set, __unset_registered); +		break; +	case CSS_EVAL_NOT_ONLINE: +		bus_for_each_dev(&css_bus_type, NULL, set, __unset_online); +		break; +	default: +		break; +	} +  	/* Apply to slow_subchannel_set. */  	spin_lock_irqsave(&slow_subchannel_lock, flags); -	idset_add_set(slow_subchannel_set, unreg_set); +	idset_add_set(slow_subchannel_set, set);  	atomic_set(&css_eval_scheduled, 1);  	queue_delayed_work(cio_work_q, &slow_path_work, delay);  	spin_unlock_irqrestore(&slow_subchannel_lock, flags); -	idset_free(unreg_set); +	idset_free(set);  }  void css_wait_for_slow_path(void) @@ -820,7 +842,7 @@ void css_wait_for_slow_path(void)  void css_schedule_reprobe(void)  {  	/* Schedule with a delay to allow merging of subsequent calls. */ -	css_schedule_eval_all_unreg(1 * HZ); +	css_schedule_eval_cond(CSS_EVAL_UNREG, 1 * HZ);  }  EXPORT_SYMBOL_GPL(css_schedule_reprobe); |