From patchwork Tue May 1 13:25:32 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Vorontsov X-Patchwork-Id: 8316 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id ED26523E9A for ; Tue, 1 May 2012 13:26:55 +0000 (UTC) Received: from mail-iy0-f180.google.com (mail-iy0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id 94CC9A1838B for ; Tue, 1 May 2012 13:26:55 +0000 (UTC) Received: by iage36 with SMTP id e36so7605507iag.11 for ; Tue, 01 May 2012 06:26:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:date:from :to:cc:subject:message-id:references:mime-version:content-type :content-disposition:in-reply-to:user-agent:x-gm-message-state; bh=+P+ytiWoiuf8SOri9zBsjYqI/9aiNvx6VTLY44nyNzg=; b=fw5WP0aEelRJm6YjbBZIQb0vLNgfJGwIX1ln+hBmbQff8srZSeYWmLKPl3J9HYrQ1r /vdMJJ7gNMJZQaagqfcitzfKN0BNnQZBGXodRto3EWC/F1FyxVz1Pabe5f9ior4tdIek /kfjI6oa1XX/m24czXD7YgcqWwixIosB8PS5v9UqYnkzkj8S2SHjaFfN7jpI8SRP6dp0 ui24jGF3EljhCSob10TuazntCOvspyM+E5uzwHPv16iOES39Ys0jcNCJHNBLEd1F1GWj 9+aLfHS4OGNVJJien+9G/RE9VStmWIcNksHv5LKhQX7EairhXX9vqqaHj5mVTnYm7MTJ HBag== Received: by 10.42.139.9 with SMTP id e9mr8141043icu.43.1335878815040; Tue, 01 May 2012 06:26:55 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.137.198 with SMTP id x6csp180770ibt; Tue, 1 May 2012 06:26:54 -0700 (PDT) Received: by 10.68.227.33 with SMTP id rx1mr31602930pbc.102.1335878814347; Tue, 01 May 2012 06:26:54 -0700 (PDT) Received: from mail-pb0-f50.google.com (mail-pb0-f50.google.com [209.85.160.50]) by mx.google.com with ESMTPS id pu5si11037350pbb.301.2012.05.01.06.26.54 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 01 May 2012 06:26:54 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.160.50 is neither permitted nor denied by best guess record for domain of anton.vorontsov@linaro.org) client-ip=209.85.160.50; Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.160.50 is neither permitted nor denied by best guess record for domain of anton.vorontsov@linaro.org) smtp.mail=anton.vorontsov@linaro.org Received: by pbcxa12 with SMTP id xa12so5765934pbc.37 for ; Tue, 01 May 2012 06:26:54 -0700 (PDT) Received: by 10.68.238.1 with SMTP id vg1mr4553948pbc.111.1335878813964; Tue, 01 May 2012 06:26:53 -0700 (PDT) Received: from localhost (c-71-204-165-222.hsd1.ca.comcast.net. [71.204.165.222]) by mx.google.com with ESMTPS id q5sm19283219pbp.28.2012.05.01.06.26.51 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 01 May 2012 06:26:53 -0700 (PDT) Date: Tue, 1 May 2012 06:25:32 -0700 From: Anton Vorontsov To: Pekka Enberg Cc: Leonid Moiseichuk , John Stultz , linux-mm@kvack.org, linux-kernel@vger.kernel.org, linaro-kernel@lists.linaro.org, patches@linaro.org, kernel-team@android.com Subject: [PATCH 1/3] vmevent: Implement equal-to attribute state Message-ID: <20120501132531.GA24226@lizard> References: <20120501132409.GA22894@lizard> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20120501132409.GA22894@lizard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Gm-Message-State: ALoCoQmfqQcCOGAfZCpkhO74/jMn78j8kBGJTsKx+jgtXrbC+REQ6W5Ep/VcBEwraSksZikIWuwd This complements GT and LT, making it possible to combine GE and LE operators. We'll use it for blended attributes: the special attributes will return either 0 or , so to make two-way notifications we will pass LT | EQ bits. Signed-off-by: Anton Vorontsov --- include/linux/vmevent.h | 6 +++++- mm/vmevent.c | 22 +++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/include/linux/vmevent.h b/include/linux/vmevent.h index ca97cf0..aae0d24 100644 --- a/include/linux/vmevent.h +++ b/include/linux/vmevent.h @@ -27,9 +27,13 @@ enum { */ VMEVENT_ATTR_STATE_VALUE_GT = (1UL << 1), /* + * Sample value is equal to user-specified value + */ + VMEVENT_ATTR_STATE_VALUE_EQ = (1UL << 2), + /* * One-shot mode. */ - VMEVENT_ATTR_STATE_ONE_SHOT = (1UL << 2), + VMEVENT_ATTR_STATE_ONE_SHOT = (1UL << 3), /* Saved state, used internally by the kernel for one-shot mode. */ __VMEVENT_ATTR_STATE_VALUE_WAS_LT = (1UL << 30), diff --git a/mm/vmevent.c b/mm/vmevent.c index 47ed448..9f1520b 100644 --- a/mm/vmevent.c +++ b/mm/vmevent.c @@ -87,28 +87,39 @@ static bool vmevent_match(struct vmevent_watch *watch) 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; - if (attr_lt || attr_gt) { + if (attr_lt || attr_gt || attr_eq) { bool one_shot = state & VMEVENT_ATTR_STATE_ONE_SHOT; 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)) && !one_shot) + if (((attr_lt && lt) || (attr_gt && gt) || + (attr_eq && eq)) && !one_shot) return true; - if (attr_lt && lt && was_lt) { + if (attr_eq && eq && was_eq) { return false; - } else if (attr_gt && gt && was_gt) { + } 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; @@ -119,9 +130,6 @@ static bool vmevent_match(struct vmevent_watch *watch) state &= ~was_lt_mask; if (attr_gt) ret = true; - } else { - state &= ~was_lt_mask; - state &= ~was_gt_mask; } attr->state = state;