Soon we'll use this new function for other code; plus this makes code less indented. Signed-off-by: Anton Vorontsov <anton.vorontsov@xxxxxxxxxx> --- mm/vmevent.c | 107 +++++++++++++++++++++++++++++++---------------------------- 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/mm/vmevent.c b/mm/vmevent.c index 39ef786..d434c11 100644 --- a/mm/vmevent.c +++ b/mm/vmevent.c @@ -77,6 +77,59 @@ enum { VMEVENT_ATTR_STATE_VALUE_WAS_GT = (1UL << 31), }; +static bool vmevent_match_attr(struct vmevent_attr *attr, u64 value) +{ + u32 state = attr->state; + bool attr_lt = state & VMEVENT_ATTR_STATE_VALUE_LT; + bool attr_gt = state & VMEVENT_ATTR_STATE_VALUE_GT; + bool attr_eq = state & VMEVENT_ATTR_STATE_VALUE_EQ; + bool edge = state & VMEVENT_ATTR_STATE_EDGE_TRIGGER; + u32 was_lt_mask = VMEVENT_ATTR_STATE_VALUE_WAS_LT; + u32 was_gt_mask = VMEVENT_ATTR_STATE_VALUE_WAS_GT; + bool lt = value < attr->value; + bool gt = value > attr->value; + bool eq = value == attr->value; + bool was_lt = state & was_lt_mask; + bool was_gt = state & was_gt_mask; + bool was_eq = was_lt && was_gt; + bool ret = false; + + if (!state) + return false; + + if (!attr_lt && !attr_gt && !attr_eq) + return false; + + if (((attr_lt && lt) || (attr_gt && gt) || (attr_eq && eq)) && !edge) + return true; + + if (attr_eq && eq && was_eq) { + return false; + } else if (attr_lt && lt && was_lt && !was_eq) { + return false; + } else if (attr_gt && gt && was_gt && !was_eq) { + return false; + } else if (eq) { + state |= was_lt_mask; + state |= was_gt_mask; + if (attr_eq) + ret = true; + } else if (lt) { + state |= was_lt_mask; + state &= ~was_gt_mask; + if (attr_lt) + ret = true; + } else if (gt) { + state |= was_gt_mask; + state &= ~was_lt_mask; + if (attr_gt) + ret = true; + } + + attr->state = state; + return ret; +} + static bool vmevent_match(struct vmevent_watch *watch) { struct vmevent_config *config = &watch->config; @@ -84,57 +137,11 @@ static bool vmevent_match(struct vmevent_watch *watch) for (i = 0; i < config->counter; i++) { struct vmevent_attr *attr = &config->attrs[i]; - u32 state = attr->state; - bool attr_lt = state & VMEVENT_ATTR_STATE_VALUE_LT; - bool attr_gt = state & VMEVENT_ATTR_STATE_VALUE_GT; - bool attr_eq = state & VMEVENT_ATTR_STATE_VALUE_EQ; - - if (!state) - continue; + u64 val; - if (attr_lt || attr_gt || attr_eq) { - bool edge = state & VMEVENT_ATTR_STATE_EDGE_TRIGGER; - u32 was_lt_mask = VMEVENT_ATTR_STATE_VALUE_WAS_LT; - u32 was_gt_mask = VMEVENT_ATTR_STATE_VALUE_WAS_GT; - u64 value = vmevent_sample_attr(watch, attr); - bool lt = value < attr->value; - bool gt = value > attr->value; - bool eq = value == attr->value; - bool was_lt = state & was_lt_mask; - bool was_gt = state & was_gt_mask; - bool was_eq = was_lt && was_gt; - bool ret = false; - - if (((attr_lt && lt) || (attr_gt && gt) || - (attr_eq && eq)) && !edge) - return true; - - if (attr_eq && eq && was_eq) { - return false; - } else if (attr_lt && lt && was_lt && !was_eq) { - return false; - } else if (attr_gt && gt && was_gt && !was_eq) { - return false; - } else if (eq) { - state |= was_lt_mask; - state |= was_gt_mask; - if (attr_eq) - ret = true; - } else if (lt) { - state |= was_lt_mask; - state &= ~was_gt_mask; - if (attr_lt) - ret = true; - } else if (gt) { - state |= was_gt_mask; - state &= ~was_lt_mask; - if (attr_gt) - ret = true; - } - - attr->state = state; - return ret; - } + val = vmevent_sample_attr(watch, attr); + if (vmevent_match_attr(attr, val)) + return true; } return false; -- 1.7.12.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>