mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
s390/css: Prevent unnecessary allocation in subchannel loop
Subchannel looping function for_each_subchannel_staged() allocates a subchannel-ID-bitmap to efficiently iterate over the list of known and unknown subchannels. Since this function is also used to iterate over known-subchannels only, optimize that case by not requiring the ID-bitmap allocation and falling back to simple bus_for_each_dev() looping. Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> Reviewed-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
175746eb06
commit
47d30674d6
@ -69,7 +69,8 @@ static int call_fn_known_sch(struct device *dev, void *data)
|
||||
struct cb_data *cb = data;
|
||||
int rc = 0;
|
||||
|
||||
idset_sch_del(cb->set, sch->schid);
|
||||
if (cb->set)
|
||||
idset_sch_del(cb->set, sch->schid);
|
||||
if (cb->fn_known_sch)
|
||||
rc = cb->fn_known_sch(sch, cb->data);
|
||||
return rc;
|
||||
@ -115,6 +116,13 @@ int for_each_subchannel_staged(int (*fn_known)(struct subchannel *, void *),
|
||||
cb.fn_known_sch = fn_known;
|
||||
cb.fn_unknown_sch = fn_unknown;
|
||||
|
||||
if (fn_known && !fn_unknown) {
|
||||
/* Skip idset allocation in case of known-only loop. */
|
||||
cb.set = NULL;
|
||||
return bus_for_each_dev(&css_bus_type, NULL, &cb,
|
||||
call_fn_known_sch);
|
||||
}
|
||||
|
||||
cb.set = idset_sch_new();
|
||||
if (!cb.set)
|
||||
/* fall back to brute force scanning in case of oom */
|
||||
|
Loading…
Reference in New Issue
Block a user