<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.linux.kernel.mm">
    <title>gmane.linux.kernel.mm</title>
    <link>http://blog.gmane.org/gmane.linux.kernel.mm</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/79009"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/79008"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/79007"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78979"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78978"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78972"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78971"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78970"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78969"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78968"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78967"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78966"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78965"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78956"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78955"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78953"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78952"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78951"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78950"/>
        <rdf:li rdf:resource="http://permalink.gmane.org/gmane.linux.kernel.mm/78948"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/79009">
    <title>Re: [PATCH v3 00/28] kmem limitation for memcg</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/79009</link>
    <description>&lt;pre&gt;
memcg-devel tree is only to make development easier. Everything that
applies on top of this tree should be applicable to both -mm and
linux-next.
So the patches should go via traditional Andrew's channel.
&lt;/pre&gt;</description>
    <dc:creator>Michal Hocko</dc:creator>
    <dc:date>2012-05-25T13:34:41</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/79008">
    <title>[PATCH v3 28/28] Documentation: add documentation for slab tracker for memcg</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/79008</link>
    <description>&lt;pre&gt;In a separate patch, to aid reviewers.

Signed-off-by: Glauber Costa &amp;lt;glommer&amp;lt; at &amp;gt;parallels.com&amp;gt;
CC: Christoph Lameter &amp;lt;cl&amp;lt; at &amp;gt;linux.com&amp;gt;
CC: Pekka Enberg &amp;lt;penberg&amp;lt; at &amp;gt;cs.helsinki.fi&amp;gt;
CC: Michal Hocko &amp;lt;mhocko&amp;lt; at &amp;gt;suse.cz&amp;gt;
CC: Kamezawa Hiroyuki &amp;lt;kamezawa.hiroyu&amp;lt; at &amp;gt;jp.fujitsu.com&amp;gt;
CC: Johannes Weiner &amp;lt;hannes&amp;lt; at &amp;gt;cmpxchg.org&amp;gt;
CC: Suleiman Souhlal &amp;lt;suleiman&amp;lt; at &amp;gt;google.com&amp;gt;
CC: Randy Dunlap &amp;lt;rdunlap&amp;lt; at &amp;gt;xenotime.net&amp;gt;
---
 Documentation/cgroups/memory.txt |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt
index 4c95c00..9accaa1 100644
--- a/Documentation/cgroups/memory.txt
+++ b/Documentation/cgroups/memory.txt
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -75,6 +75,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Brief summary of control files.
  memory.kmem.tcp.limit_in_bytes  # set/show hard limit for tcp buf memory
  memory.kmem.tcp.usage_in_bytes  # show current tcp buf memory allocation
 
+ memory.kmem.limit_in_bytes # set/show hard limit for general kmem memory
+ memory.kmem.usage_in_bytes # show current general kmem memory allocation
+ memory.kmem.failcnt # show current number of kmem limit hits
+ memory.kmem.max_usage_in_bytes # show max kmem usage
+ memory.kmem.slabinfo # show cgroup-specific slab usage information
+
 1. History
 
 The memory controller has a long history. A request for comments for the memory
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -271,6 +277,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; cgroup may or may not be accounted.
 Currently no soft limit is implemented for kernel memory. It is future work
 to trigger slab reclaim when those limits are reached.
 
+Kernel memory is not accounted until it is limited. Users that want to just
+track kernel memory usage can set the limit value to a big enough value so
+the limit is guaranteed to never hit. A kernel memory limit bigger than the
+current memory limit will have this effect as well.
+
+This guarantes that this extension is backwards compatible to any previous
+memory cgroup version.
+
 2.7.1 Current Kernel Memory resources accounted
 
 * sockets memory pressure: some sockets protocols have memory pressure
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -279,6 +293,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; per cgroup, instead of globally.
 
 * tcp memory pressure: sockets memory pressure for the tcp protocol.
 
+* slab/kmalloc:
+
+When slab memory is tracked (memory.kmem.limit_in_bytes != -1ULL), both
+memory.kmem.usage_in_bytes and memory.usage_in_bytes are updated. When
+memory.kmem.limit_in_bytes is left alone, no tracking of slab caches takes
+place.
+
+Because a slab page is shared among many tasks, it is not possible to take
+any meaningful action upon task migration. Slabs created in a cgroup stay
+around until the cgroup is destructed. Information about the slabs used
+by the cgroup is displayed in the cgroup file memory.kmem.slabinfo. The format
+of this file is and should remain compatible with /proc/slabinfo.
+
+Upon cgroup destruction, slabs that holds no live references are destructed.
+Workers are fired to destroy the remaining caches as they objects are freed.
+
+Memory used by dead caches are shown in the proc file /proc/dead_slabinfo
+
 3. User Interface
 
 0. Configuration
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -287,6 +319,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; a. Enable CONFIG_CGROUPS
 b. Enable CONFIG_RESOURCE_COUNTERS
 c. Enable CONFIG_CGROUP_MEM_RES_CTLR
 d. Enable CONFIG_CGROUP_MEM_RES_CTLR_SWAP (to use swap extension)
+d. Enable CONFIG_CGROUP_MEM_RES_CTLR_KMEM (to use experimental kmem extension)
 
 1. Prepare the cgroups (see cgroups.txt, Why are cgroups needed?)
 # mount -t tmpfs none /sys/fs/cgroup
&lt;/pre&gt;</description>
    <dc:creator>Glauber Costa</dc:creator>
    <dc:date>2012-05-25T13:03:48</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/79007">
    <title>[PATCH v3 27/28] memcg: propagate kmem limiting information to children</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/79007</link>
    <description>&lt;pre&gt;The current memcg slab cache management fails to present satisfatory hierarchical
behavior in the following scenario:

-&amp;gt; /cgroups/memory/A/B/C

* kmem limit set at A
* A and B empty taskwise
* bash in C does find /

Because kmem_accounted is a boolean that was not set for C, no accounting
would be done. This is, however, not what we expect.

The basic idea, is that when a cgroup is limited, we walk the tree
upwards (something Kame and I already thought about doing for other purposes),
and make sure that we store the information about the parent being limited in
kmem_accounted (that is turned into a bitmap: two booleans would not be space
efficient). The code for that is taken from sched/core.c. My reasons for not
putting it into a common place is to dodge the type issues that would arise
from a common implementation between memcg and the scheduler - but I think
that it should ultimately happen, so if you want me to do it now, let me
know.

We do the reverse operation when a formerly limited cgroup becomes unlimited.

Signed-off-by: Glauber Costa &amp;lt;glommer&amp;lt; at &amp;gt;parallels.com&amp;gt;
CC: Christoph Lameter &amp;lt;cl&amp;lt; at &amp;gt;linux.com&amp;gt;
CC: Pekka Enberg &amp;lt;penberg&amp;lt; at &amp;gt;cs.helsinki.fi&amp;gt;
CC: Michal Hocko &amp;lt;mhocko&amp;lt; at &amp;gt;suse.cz&amp;gt;
CC: Kamezawa Hiroyuki &amp;lt;kamezawa.hiroyu&amp;lt; at &amp;gt;jp.fujitsu.com&amp;gt;
CC: Johannes Weiner &amp;lt;hannes&amp;lt; at &amp;gt;cmpxchg.org&amp;gt;
CC: Suleiman Souhlal &amp;lt;suleiman&amp;lt; at &amp;gt;google.com&amp;gt;
---
 mm/memcontrol.c |  147 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 131 insertions(+), 16 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 3e99c69..7572cb1 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -259,6 +259,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct mem_cgroup {
  * the counter to account for kernel memory usage.
  */
 struct res_counter kmem;
+
+struct list_head children;
+struct list_head siblings;
 /*
  * Per cgroup active and inactive list, similar to the
  * per zone LRU lists.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -274,7 +277,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct mem_cgroup {
  * Should the accounting and control be hierarchical, per subtree?
  */
 bool use_hierarchy;
-bool kmem_accounted;
+/*
+ * bit0: accounted by this cgroup
+ * bit1: accounted by a parent.
+ */
+volatile unsigned long kmem_accounted;
 
 booloom_lock;
 atomic_tunder_oom;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -332,6 +339,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct mem_cgroup {
 #endif
 };
 
+#define KMEM_ACCOUNTED_THIS0
+#define KMEM_ACCOUNTED_PARENT1
+
 int memcg_css_id(struct mem_cgroup *memcg)
 {
 return css_id(&amp;amp;memcg-&amp;gt;css);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -474,7 +484,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void sock_release_memcg(struct sock *sk)
 
 static void disarm_static_keys(struct mem_cgroup *memcg)
 {
-if (memcg-&amp;gt;kmem_accounted)
+if (test_bit(KMEM_ACCOUNTED_THIS, &amp;amp;memcg-&amp;gt;kmem_accounted))
 static_key_slow_dec(&amp;amp;mem_cgroup_kmem_enabled_key);
 /*
  * This check can't live in kmem destruction function,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4472,6 +4482,110 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static ssize_t mem_cgroup_read(struct cgroup *cont, struct cftype *cft,
 len = scnprintf(str, sizeof(str), "%llu\n", (unsigned long long)val);
 return simple_read_from_buffer(buf, nbytes, ppos, str, len);
 }
+
+#ifdef CONFIG_CGROUP_MEM_RES_CTLR_KMEM
+typedef int (*memcg_visitor)(struct mem_cgroup*, void *);
+
+/*
+ * This is mostly "inspired" by the code in sched/core.c. I decided to copy it,
+ * instead of factoring it, because of all the typing issues we'd run into.
+ * In particular, grabbing the parent is very different for memcg, because we
+ * may or may not have hierarchy, while cpu cgroups always do. That would lead
+ * to either indirect calls - this is not a fast path for us, but can be for
+ * the scheduler - or a big and ugly macro.
+ *
+ * If we ever get rid of hierarchy, we could iterate over struct cgroup, and
+ * then it would cease to be a problem.
+ */
+int walk_tree_from(struct mem_cgroup *from,
+   memcg_visitor down, memcg_visitor up, void *data)
+{
+struct mem_cgroup *parent, *child;
+int ret;
+
+
+parent = from;
+down:
+ret = (*down)(parent, data);
+if (ret)
+goto out;
+
+list_for_each_entry_rcu(child, &amp;amp;parent-&amp;gt;children, siblings) {
+parent = child;
+goto down;
+
+up:
+continue;
+}
+ret = (*up)(parent, data);
+if (ret || parent == from)
+goto out;
+
+child = parent;
+parent = parent_mem_cgroup(parent);
+if (parent)
+goto up;
+out:
+return ret;
+}
+
+static int memcg_nop(struct mem_cgroup *memcg, void *data)
+{
+return 0;
+}
+
+static int memcg_parent_account(struct mem_cgroup *memcg, void *data)
+{
+if (memcg == data)
+return 0;
+
+set_bit(KMEM_ACCOUNTED_PARENT, &amp;amp;memcg-&amp;gt;kmem_accounted);
+return 0;
+}
+
+static int memcg_parent_no_account(struct mem_cgroup *memcg, void *data)
+{
+if (memcg == data)
+return 0;
+
+clear_bit(KMEM_ACCOUNTED_PARENT, &amp;amp;memcg-&amp;gt;kmem_accounted);
+/*
+ * Stop propagation if we are accounted: our children should
+ * be parent-accounted
+ */
+return test_bit(KMEM_ACCOUNTED_THIS, &amp;amp;memcg-&amp;gt;kmem_accounted);
+}
+
+static void mem_cgroup_update_kmem_limit(struct mem_cgroup *memcg, u64 val)
+{
+mutex_lock(&amp;amp;set_limit_mutex);
+if (!test_and_set_bit(KMEM_ACCOUNTED_THIS, &amp;amp;memcg-&amp;gt;kmem_accounted) &amp;amp;&amp;amp;
+val != RESOURCE_MAX) {
+
+/*
+ * Once enabled, can't be disabled. We could in theory
+ * disable it if we haven't yet created any caches, or
+ * if we can shrink them all to death.
+ *
+ * But it is not worth the trouble
+ */
+static_key_slow_inc(&amp;amp;mem_cgroup_kmem_enabled_key);
+
+rcu_read_lock();
+walk_tree_from(memcg, memcg_parent_account, memcg_nop, memcg);
+rcu_read_unlock();
+} else if (test_and_clear_bit(KMEM_ACCOUNTED_THIS, &amp;amp;memcg-&amp;gt;kmem_accounted)
+&amp;amp;&amp;amp; val == RESOURCE_MAX) {
+
+rcu_read_lock();
+walk_tree_from(memcg, memcg_parent_no_account,
+       memcg_nop, memcg);
+rcu_read_unlock();
+}
+
+mutex_unlock(&amp;amp;set_limit_mutex);
+}
+#endif
 /*
  * The user of this function is...
  * RES_LIMIT.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4509,20 +4623,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int mem_cgroup_write(struct cgroup *cont, struct cftype *cft,
 ret = res_counter_set_limit(&amp;amp;memcg-&amp;gt;kmem, val);
 if (ret)
 break;
-/*
- * Once enabled, can't be disabled. We could in theory
- * disable it if we haven't yet created any caches, or
- * if we can shrink them all to death.
- *
- * But it is not worth the trouble
- */
-mutex_lock(&amp;amp;set_limit_mutex);
-if (!memcg-&amp;gt;kmem_accounted &amp;amp;&amp;amp; val != RESOURCE_MAX
-    &amp;amp;&amp;amp; !memcg-&amp;gt;kmem_accounted) {
-static_key_slow_inc(&amp;amp;mem_cgroup_kmem_enabled_key);
-memcg-&amp;gt;kmem_accounted = true;
-}
-mutex_unlock(&amp;amp;set_limit_mutex);
+mem_cgroup_update_kmem_limit(memcg, val);
+break;
 }
 #endif
 else
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5592,6 +5694,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; err_cleanup:
 
 }
 
+static DEFINE_MUTEX(memcg_list_mutex);
+
 static struct cgroup_subsys_state * __ref
 mem_cgroup_create(struct cgroup *cont)
 {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5607,6 +5711,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mem_cgroup_create(struct cgroup *cont)
 if (alloc_mem_cgroup_per_zone_info(memcg, node))
 goto free_out;
 
+INIT_LIST_HEAD(&amp;amp;memcg-&amp;gt;children);
 /* root ? */
 if (cont-&amp;gt;parent == NULL) {
 int cpu;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5645,6 +5750,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; mem_cgroup_create(struct cgroup *cont)
  * mem_cgroup(see mem_cgroup_put).
  */
 mem_cgroup_get(parent);
+
+mutex_lock(&amp;amp;memcg_list_mutex);
+list_add_rcu(&amp;amp;memcg-&amp;gt;siblings, &amp;amp;parent-&amp;gt;children);
+mutex_unlock(&amp;amp;memcg_list_mutex);
 } else {
 res_counter_init(&amp;amp;memcg-&amp;gt;res, NULL);
 res_counter_init(&amp;amp;memcg-&amp;gt;memsw, NULL);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5687,9 +5796,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static int mem_cgroup_pre_destroy(struct cgroup *cont)
 static void mem_cgroup_destroy(struct cgroup *cont)
 {
 struct mem_cgroup *memcg = mem_cgroup_from_cont(cont);
+struct mem_cgroup *parent = parent_mem_cgroup(memcg);
 
 kmem_cgroup_destroy(memcg);
 
+mutex_lock(&amp;amp;memcg_list_mutex);
+if (parent)
+list_del_rcu(&amp;amp;memcg-&amp;gt;siblings);
+mutex_unlock(&amp;amp;memcg_list_mutex);
+
 mem_cgroup_put(memcg);
 }
 
&lt;/pre&gt;</description>
    <dc:creator>Glauber Costa</dc:creator>
    <dc:date>2012-05-25T13:03:47</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78979">
    <title>mm: fix faulty initialization in vmalloc_init()</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78979</link>
    <description>&lt;pre&gt;On Fri, May 25, 2012 at 7:12 AM, Andrew Morton &amp;lt;akpm&amp;lt; at &amp;gt;linux-foundation.org&amp;gt;
wrote:

Sorry for unkind commit message :)
Why this patch is needed is described by Olav
in the previous replies.


If it is not set, find_vm_area() with the early vm regions will always fail.

If the early vm regions must be neither found by find_vm_area()
nor removed by remove_vm_area(), va-&amp;gt;vm must be NULL.

Please advise me what is right value for va-&amp;gt;vm here :)

linux-samsung-soc" in
&lt;/pre&gt;</description>
    <dc:creator>KyongHo Cho</dc:creator>
    <dc:date>2012-05-25T12:39:29</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78978">
    <title>mm: fix faulty initialization in vmalloc_init()</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78978</link>
    <description>&lt;pre&gt;flags
gets
Thanks for description.

va-&amp;gt;flags has different types of flags from tmp-&amp;gt;flags.
If a region with VM_IOREMAP set is registered with vm_area_add_early(),
it will be removed by __purge_vmap_area_lazy().

 Cho KyongHo.
&lt;/pre&gt;</description>
    <dc:creator>KyongHo Cho</dc:creator>
    <dc:date>2012-05-25T11:12:40</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78972">
    <title>Re: [PATCH 0/2 v4] Flexible proportions</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78972</link>
    <description>&lt;pre&gt;
Thank you both for making it work!  I've applied them to the writeback tree.

Thanks,
Fengguang

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Fengguang Wu</dc:creator>
    <dc:date>2012-05-25T09:29:36</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78971">
    <title>Re: [PATCH 0/2 v4] Flexible proportions</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78971</link>
    <description>&lt;pre&gt;
Thanks, all I could come up with is comment placement nits and I'll not
go there ;-)

Acked-by: Peter Zijlstra &amp;lt;a.p.zijlstra&amp;lt; at &amp;gt;chello.nl&amp;gt;

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Peter Zijlstra</dc:creator>
    <dc:date>2012-05-25T09:12:42</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78970">
    <title>Re: [PATCH 2/2] vmevent: pass right attribute to vmevent_sample_attr()</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78970</link>
    <description>&lt;pre&gt;
Right. I think Anton is reworking his patch which is why it's not merged 
to vmevent/core.

I applied your patch, thanks!

Pekka

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Pekka Enberg</dc:creator>
    <dc:date>2012-05-25T09:11:07</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78969">
    <title>Re: [PATCH 2/2] vmevent: pass right attribute to vmevent_sample_attr()</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78969</link>
    <description>&lt;pre&gt;

Ah, sorry for that.  I generated this patch with Anton's "vmevent: Implement
special low-memory attribute" patch applied..  Here is a version against
vanilla vmevent-core:

From: Bartlomiej Zolnierkiewicz &amp;lt;b.zolnierkie&amp;lt; at &amp;gt;samsung.com&amp;gt;
Subject: [PATCH] vmevent: pass right attribute to vmevent_sample_attr()

Pass "config attribute" (&amp;amp;watch-&amp;gt;config-&amp;gt;attrs[i]) not "sample
attribute" (&amp;amp;watch-&amp;gt;sample_attrs[i]) to vmevent_sample_attr() to
allow use of the original attribute value in vmevent_attr_sample_fn().

Cc: Anton Vorontsov &amp;lt;anton.vorontsov&amp;lt; at &amp;gt;linaro.org&amp;gt;
Signed-off-by: Bartlomiej Zolnierkiewicz &amp;lt;b.zolnierkie&amp;lt; at &amp;gt;samsung.com&amp;gt;
Signed-off-by: Kyungmin Park &amp;lt;kyungmin.park&amp;lt; at &amp;gt;samsung.com&amp;gt;
---
Without this patch vmevent_attr_lowmem_pages() always returns 0.

 mm/vmevent.c |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Index: b/mm/vmevent.c
===================================================================
--- a/mm/vmevent.c2012-05-25 10:13:49.000000000 +0200
+++ b/mm/vmevent.c2012-05-25 10:13:56.231805967 +0200
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -31,6 +31,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
  */
 unsigned longnr_attrs;
 struct vmevent_attr*sample_attrs;
+struct vmevent_attr*config_attrs[VMEVENT_CONFIG_MAX_ATTRS];
 
 /* sampling */
 struct timer_listtimer;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -170,7 +171,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 for (i = 0; i &amp;lt; watch-&amp;gt;nr_attrs; i++) {
 struct vmevent_attr *attr = &amp;amp;watch-&amp;gt;sample_attrs[i];
 
-attr-&amp;gt;value = vmevent_sample_attr(watch, attr);
+attr-&amp;gt;value = vmevent_sample_attr(watch,
+  watch-&amp;gt;config_attrs[i]);
 }
 
 atomic_set(&amp;amp;watch-&amp;gt;pending, 1);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -313,6 +315,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 attrs[nr].type = attr-&amp;gt;type;
 attrs[nr].value = 0;
 attrs[nr].state = 0;
+
+watch-&amp;gt;config_attrs[nr] = attr;
+
 nr++;
 }
 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Bartlomiej Zolnierkiewicz</dc:creator>
    <dc:date>2012-05-25T08:15:06</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78968">
    <title>Re: [PATCH] vmevent: add arm support</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78968</link>
    <description>&lt;pre&gt;

Applied, thanks!

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Pekka Enberg</dc:creator>
    <dc:date>2012-05-25T07:20:14</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78967">
    <title>Re: [PATCH 2/2] vmevent: pass right attribute to vmevent_sample_attr()</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78967</link>
    <description>&lt;pre&gt;

Looks good. I'm getting rejects for this. What tree did you use to 
generate the patch?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Pekka Enberg</dc:creator>
    <dc:date>2012-05-25T07:19:45</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78966">
    <title>Re: [PATCH 1/2] vmevent: don't leak unitialized data to userspace</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78966</link>
    <description>&lt;pre&gt;
Applied, thanks!

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Pekka Enberg</dc:creator>
    <dc:date>2012-05-25T07:17:16</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78965">
    <title>RE: mm: fix faulty initialization in vmalloc_init()</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78965</link>
    <description>&lt;pre&gt; &amp;gt; -va-&amp;gt;flags = tmp-&amp;gt;flags | VM_VM_AREA;

I was actually debugging the same exact issue today. This transfer of flags
actually causes some of the static mapping virtual addresses to be
prematurely freed (before the mapping is removed) because VM_LAZY_FREE gets
"set" if tmp-&amp;gt;flags has VM_IOREMAP set. This might cause subsequent
vmalloc/ioremap calls to fail because it might allocate one of the freed
virtual address ranges that aren't unmapped. 

--
Olav Haugan

Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.


--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Olav Haugan</dc:creator>
    <dc:date>2012-05-25T00:24:01</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78956">
    <title>Re: mm: kernel BUG at mm/memory.c:1230</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78956</link>
    <description>&lt;pre&gt;On Thu, May 24, 2012 at 9:07 PM, Andrew Morton
&amp;lt;akpm&amp;lt; at &amp;gt;linux-foundation.org&amp;gt; wrote:

Yup.


I'm not sure if that's indeed the issue or not, but note that this is
the first time I've managed to trigger that with the fuzzer, and it's
not that easy to reproduce. Which is a bit odd for code that was there
for 4 months...

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Sasha Levin</dc:creator>
    <dc:date>2012-05-24T19:14:05</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78955">
    <title>Re: mm: kernel BUG at mm/memory.c:1230</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78955</link>
    <description>&lt;pre&gt;On Thu, 24 May 2012 20:27:34 +0200
Sasha Levin &amp;lt;levinsasha928&amp;lt; at &amp;gt;gmail.com&amp;gt; wrote:


That's

VM_BUG_ON(!rwsem_is_locked(&amp;amp;tlb-&amp;gt;mm-&amp;gt;mmap_sem));

in zap_pmd_range()?


The assertion was added in Jan 2011 by 14d1a55cd26f1860 ("thp: add
debug checks for mapcount related invariants").  AFAICT it's just wrong
on the exit path.  Unclear why it's triggering now...

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Andrew Morton</dc:creator>
    <dc:date>2012-05-24T19:07:27</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78953">
    <title>[PATCH 0/2 v4] Flexible proportions</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78953</link>
    <description>&lt;pre&gt;
  Hello,

  here is the next iteration of my flexible proportions code. I've addressed
all Peter's comments.
Changes since v3:
  * changed fprop_fraction_foo() to avoid using percpu_counter_sum()
  * changed __fprop_inc_percpu_max() to avoid 64-bit division (now maximum
    allowed fraction is expressed max_frac/FPROP_FRAC_BASE)
  * avoid drifting of period timer
  * handle better cases where period timer fires long after intended time by
    aging by really passed number of periods
Changes since v2:
  * use timer instead of workqueue for triggering period switch
  * arm timer only if aging didn't zero out all fractions, re-arm timer when
    new event arrives again
  * set period length to 3s

  Some introduction for first time readers:

  The idea of this patch set is to provide code for computing event proportions
where aging period is not dependent on the number of events happening (so
that aging works well both with fast storage and slow USB sticks in the same
system).

  The basic idea is that we compute proportions as:
p_j = (\Sum_{i&amp;gt;=0} x_{i,j}/2^{i+1}) / (\Sum_{i&amp;gt;=0} x_i/2^{i+1})

  Where x_{i,j} is j's number of events in i-th last time period and x_i is
total number of events in i-th last time period.

  Note that when x_i's are all the same (as is the case with current
proportion code), this expression simplifies to the expression defining
current proportions which is:
p_j =  \Sum_{i&amp;gt;=0} x_{i,j}/2^{i+1} / t

  where t is the lenght of the aging period.

  In fact, if we are in the middle of the period, the proportion computed by
the current code is:
p_j = (x_0 + \Sum_{i&amp;gt;=1} x_{i,j}/2^{i+1}) / (t' + t)

  where t' is total number of events in the running period and t is the lenght
of the aging period. So there is event more similarity.

  Similarly as with current proportion code, it is simple to compute update
proportion after several periods have elapsed. For each proportion we store
the numerator of our fraction and the number of period when the proportion
was last updated. In global proportion structure we compute the denominator
of the fraction which is the same for all event types. So catch up with missed
periods boils down to shifting the numerator by the number of missed periods
and that's it. For more details, please see the code.

  I've also run a few tests (I've created a userspace wrapper to allow me to
run proportion code in userpace and arbitrarily generate events for it) to
compare the behavior of old and new code. You can see them at
http://beta.suse.com/private/jack/flex_proportions/ In all the tests new code
showed faster convergence to current event proportions (I tried to
realistically set period_shift for fixed proportions).  Also in the last test
we see that if period_shift is decreased, then current proportions become more
sensitive to short term fluctuations in event rate so just decreasing
period_shift isn't a good solution to slower convergence. If anyone has other
idea what to try, I can do that - it should be simple enough to implement in
my testing tool.

Honza

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Jan Kara</dc:creator>
    <dc:date>2012-05-24T16:59:09</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78952">
    <title>[PATCH 1/2] lib: Proportions with flexible period</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78952</link>
    <description>&lt;pre&gt;Implement code computing proportions of events of different type (like code in
lib/proportions.c) but allowing periods to have different lengths. This allows
us to have aging periods of fixed wallclock time which gives better proportion
estimates given the hugely varying throughput of different devices - previous
measuring of aging period by number of events has the problem that a reasonable
period length for a system with low-end USB stick is not a reasonable period
length for a system with high-end storage array resulting either in too slow
proportion updates or too fluctuating proportion updates.

Signed-off-by: Jan Kara &amp;lt;jack&amp;lt; at &amp;gt;suse.cz&amp;gt;
---
 include/linux/flex_proportions.h |  100 ++++++++++++++
 lib/Makefile                     |    2 +-
 lib/flex_proportions.c           |  267 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 368 insertions(+), 1 deletions(-)
 create mode 100644 include/linux/flex_proportions.h
 create mode 100644 lib/flex_proportions.c

diff --git a/include/linux/flex_proportions.h b/include/linux/flex_proportions.h
new file mode 100644
index 0000000..9ac291c
--- /dev/null
+++ b/include/linux/flex_proportions.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,100 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ * Floating proportions with flexible aging period
+ *
+ *  Copyright (C) 2011, SUSE, Jan Kara &amp;lt;jack&amp;lt; at &amp;gt;suse.cz&amp;gt;
+ */
+
+#ifndef _LINUX_FLEX_PROPORTIONS_H
+#define _LINUX_FLEX_PROPORTIONS_H
+
+#include &amp;lt;linux/percpu_counter.h&amp;gt;
+#include &amp;lt;linux/spinlock.h&amp;gt;
+#include &amp;lt;linux/seqlock.h&amp;gt;
+
+/*
+ * When maximum proportion of some event type is specified, this is the
+ * precision with which we allow limitting. Note that this creates an upper
+ * bound on the number of events per period like
+ *   ULLONG_MAX &amp;gt;&amp;gt; FPROP_FRAC_SHIFT.
+ */
+#define FPROP_FRAC_SHIFT 10
+#define FPROP_FRAC_BASE (1UL &amp;lt;&amp;lt; FPROP_FRAC_SHIFT)
+
+/*
+ * ---- Global proportion definitions ----
+ */
+struct fprop_global {
+/* Number of events in the current period */
+struct percpu_counter events;
+/* Current period */
+unsigned int period;
+/* Synchronization with period transitions */
+seqcount_t sequence;
+};
+
+int fprop_global_init(struct fprop_global *p);
+void fprop_global_destroy(struct fprop_global *p);
+bool fprop_new_period(struct fprop_global *p, int periods);
+
+/*
+ *  ---- SINGLE ----
+ */
+struct fprop_local_single {
+/* the local events counter */
+unsigned long events;
+/* Period in which we last updated events */
+unsigned int period;
+raw_spinlock_t lock;/* Protect period and numerator */
+};
+
+#define INIT_FPROP_LOCAL_SINGLE(name)\
+{.lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock),\
+}
+
+int fprop_local_init_single(struct fprop_local_single *pl);
+void __fprop_inc_single(struct fprop_global *p, struct fprop_local_single *pl);
+void fprop_fraction_single(struct fprop_global *p,
+struct fprop_local_single *pl, unsigned long *numerator,
+unsigned long *denominator);
+
+static inline
+void fprop_inc_single(struct fprop_global *p, struct fprop_local_single *pl)
+{
+unsigned long flags;
+
+local_irq_save(flags);
+__fprop_inc_single(p, pl);
+local_irq_restore(flags);
+}
+
+/*
+ * ---- PERCPU ----
+ */
+struct fprop_local_percpu {
+/* the local events counter */
+struct percpu_counter events;
+/* Period in which we last updated events */
+unsigned int period;
+raw_spinlock_t lock;/* Protect period and numerator */
+};
+
+int fprop_local_init_percpu(struct fprop_local_percpu *pl);
+void fprop_local_destroy_percpu(struct fprop_local_percpu *pl);
+void __fprop_inc_percpu(struct fprop_global *p, struct fprop_local_percpu *pl);
+void __fprop_inc_percpu_max(struct fprop_global *p, struct fprop_local_percpu *pl,
+    int max_frac);
+void fprop_fraction_percpu(struct fprop_global *p,
+struct fprop_local_percpu *pl, unsigned long *numerator,
+unsigned long *denominator);
+
+static inline
+void fprop_inc_percpu(struct fprop_global *p, struct fprop_local_percpu *pl)
+{
+unsigned long flags;
+
+local_irq_save(flags);
+__fprop_inc_percpu(p, pl);
+local_irq_restore(flags);
+}
+
+#endif
diff --git a/lib/Makefile b/lib/Makefile
index 74290c9..8dd81cf 100644
--- a/lib/Makefile
+++ b/lib/Makefile
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -11,7 +11,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; lib-y := ctype.o string.o vsprintf.o cmdline.o \
  rbtree.o radix-tree.o dump_stack.o timerqueue.o\
  idr.o int_sqrt.o extable.o prio_tree.o \
  sha1.o md5.o irq_regs.o reciprocal_div.o argv_split.o \
- proportions.o prio_heap.o ratelimit.o show_mem.o \
+ proportions.o flex_proportions.o prio_heap.o ratelimit.o show_mem.o \
  is_single_threaded.o plist.o decompress.o
 
 lib-$(CONFIG_MMU) += ioremap.o
diff --git a/lib/flex_proportions.c b/lib/flex_proportions.c
new file mode 100644
index 0000000..530dbc2
--- /dev/null
+++ b/lib/flex_proportions.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,267 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+/*
+ *  Floating proportions with flexible aging period
+ *
+ *   Copyright (C) 2011, SUSE, Jan Kara &amp;lt;jack&amp;lt; at &amp;gt;suse.cz&amp;gt;
+ *
+ * The goal of this code is: Given different types of event, measure proportion
+ * of each type of event over time. The proportions are measured with
+ * exponentially decaying history to give smooth transitions. A formula
+ * expressing proportion of event of type 'j' is:
+ *
+ *   p_{j} = (\Sum_{i&amp;gt;=0} x_{i,j}/2^{i+1})/(\Sum_{i&amp;gt;=0} x_i/2^{i+1})
+ *
+ * Where x_{i,j} is j's number of events in i-th last time period and x_i is
+ * total number of events in i-th last time period.
+ *
+ * Note that p_{j}'s are normalised, i.e.
+ *
+ *   \Sum_{j} p_{j} = 1,
+ *
+ * This formula can be straightforwardly computed by maintaing denominator
+ * (let's call it 'd') and for each event type its numerator (let's call it
+ * 'n_j'). When an event of type 'j' happens, we simply need to do:
+ *   n_j++; d++;
+ *
+ * When a new period is declared, we could do:
+ *   d /= 2
+ *   for each j
+ *     n_j /= 2
+ *
+ * To avoid iteration over all event types, we instead shift numerator of event
+ * j lazily when someone asks for a proportion of event j or when event j
+ * occurs. This can bit trivially implemented by remembering last period in
+ * which something happened with proportion of type j.
+ */
+#include &amp;lt;linux/flex_proportions.h&amp;gt;
+
+int fprop_global_init(struct fprop_global *p)
+{
+int err;
+
+p-&amp;gt;period = 0;
+/* Use 1 to avoid dealing with periods with 0 events... */
+err = percpu_counter_init(&amp;amp;p-&amp;gt;events, 1);
+if (err)
+return err;
+seqcount_init(&amp;amp;p-&amp;gt;sequence);
+return 0;
+}
+
+void fprop_global_destroy(struct fprop_global *p)
+{
+percpu_counter_destroy(&amp;amp;p-&amp;gt;events);
+}
+
+/*
+ * Declare &amp;lt; at &amp;gt;periods new periods. It is upto the caller to make sure period
+ * transitions cannot happen in parallel.
+ *
+ * The function returns true if the proportions are still defined and false
+ * if aging zeroed out all events. This can be used to detect whether declaring
+ * further periods has any effect.
+ */
+bool fprop_new_period(struct fprop_global *p, int periods)
+{
+u64 events = percpu_counter_sum(&amp;amp;p-&amp;gt;events);
+
+/*
+ * Don't do anything if there are no events.
+ */
+if (events &amp;lt;= 1)
+return false;
+write_seqcount_begin(&amp;amp;p-&amp;gt;sequence);
+if (periods &amp;lt; 64)
+events -= events &amp;gt;&amp;gt; periods;
+/* Use addition to avoid losing events happening between sum and set */
+percpu_counter_add(&amp;amp;p-&amp;gt;events, -events);
+p-&amp;gt;period += periods;
+write_seqcount_end(&amp;amp;p-&amp;gt;sequence);
+
+return true;
+}
+
+/*
+ * ---- SINGLE ----
+ */
+
+int fprop_local_init_single(struct fprop_local_single *pl)
+{
+pl-&amp;gt;events = 0;
+pl-&amp;gt;period = 0;
+raw_spin_lock_init(&amp;amp;pl-&amp;gt;lock);
+return 0;
+}
+
+void fprop_local_destroy_single(struct fprop_local_single *pl)
+{
+}
+
+static void fprop_reflect_period_single(struct fprop_global *p,
+struct fprop_local_single *pl)
+{
+unsigned int period = p-&amp;gt;period;
+unsigned long flags;
+
+/* Fast path - period didn't change */
+if (pl-&amp;gt;period == period)
+return;
+raw_spin_lock_irqsave(&amp;amp;pl-&amp;gt;lock, flags);
+/* Someone updated pl-&amp;gt;period while we were spinning? */
+if (pl-&amp;gt;period &amp;gt;= period) {
+raw_spin_unlock_irqrestore(&amp;amp;pl-&amp;gt;lock, flags);
+return;
+}
+/* Aging zeroed our fraction? */
+if (period - pl-&amp;gt;period &amp;lt; BITS_PER_LONG)
+pl-&amp;gt;events &amp;gt;&amp;gt;= period - pl-&amp;gt;period;
+else
+pl-&amp;gt;events = 0;
+pl-&amp;gt;period = period;
+raw_spin_unlock_irqrestore(&amp;amp;pl-&amp;gt;lock, flags);
+}
+
+/* Event of type pl happened */
+void __fprop_inc_single(struct fprop_global *p, struct fprop_local_single *pl)
+{
+fprop_reflect_period_single(p, pl);
+pl-&amp;gt;events++;
+percpu_counter_add(&amp;amp;p-&amp;gt;events, 1);
+}
+
+/* Return fraction of events of type pl */
+void fprop_fraction_single(struct fprop_global *p,
+   struct fprop_local_single *pl,
+   unsigned long *numerator, unsigned long *denominator)
+{
+unsigned int seq;
+s64 num, den;
+
+do {
+seq = read_seqcount_begin(&amp;amp;p-&amp;gt;sequence);
+fprop_reflect_period_single(p, pl);
+num = pl-&amp;gt;events;
+den = percpu_counter_read_positive(&amp;amp;p-&amp;gt;events);
+} while (read_seqcount_retry(&amp;amp;p-&amp;gt;sequence, seq));
+
+/*
+ * Make fraction &amp;lt;= 1 and denominator &amp;gt; 0 even in presence of percpu
+ * counter errors
+ */
+if (den &amp;lt;= num) {
+if (num)
+den = num;
+else
+den = 1;
+}
+*denominator = den;
+*numerator = num;
+}
+
+/*
+ * ---- PERCPU ----
+ */
+#define PROP_BATCH (8*(1+ilog2(nr_cpu_ids)))
+
+int fprop_local_init_percpu(struct fprop_local_percpu *pl)
+{
+int err;
+
+err = percpu_counter_init(&amp;amp;pl-&amp;gt;events, 0);
+if (err)
+return err;
+pl-&amp;gt;period = 0;
+raw_spin_lock_init(&amp;amp;pl-&amp;gt;lock);
+return 0;
+}
+
+void fprop_local_destroy_percpu(struct fprop_local_percpu *pl)
+{
+percpu_counter_destroy(&amp;amp;pl-&amp;gt;events);
+}
+
+static void fprop_reflect_period_percpu(struct fprop_global *p,
+struct fprop_local_percpu *pl)
+{
+unsigned int period = p-&amp;gt;period;
+unsigned long flags;
+
+/* Fast path - period didn't change */
+if (pl-&amp;gt;period == period)
+return;
+raw_spin_lock_irqsave(&amp;amp;pl-&amp;gt;lock, flags);
+/* Someone updated pl-&amp;gt;period while we were spinning? */
+if (pl-&amp;gt;period &amp;gt;= period) {
+raw_spin_unlock_irqrestore(&amp;amp;pl-&amp;gt;lock, flags);
+return;
+}
+/* Aging zeroed our fraction? */
+if (period - pl-&amp;gt;period &amp;lt; BITS_PER_LONG) {
+s64 val = percpu_counter_read(&amp;amp;pl-&amp;gt;events);
+
+if (val &amp;lt; (nr_cpu_ids * PROP_BATCH))
+val = percpu_counter_sum(&amp;amp;pl-&amp;gt;events);
+
+__percpu_counter_add(&amp;amp;pl-&amp;gt;events,
+-val + (val &amp;gt;&amp;gt; (period-pl-&amp;gt;period)), PROP_BATCH);
+} else
+percpu_counter_set(&amp;amp;pl-&amp;gt;events, 0);
+pl-&amp;gt;period = period;
+raw_spin_unlock_irqrestore(&amp;amp;pl-&amp;gt;lock, flags);
+}
+
+/* Event of type pl happened */
+void __fprop_inc_percpu(struct fprop_global *p, struct fprop_local_percpu *pl)
+{
+fprop_reflect_period_percpu(p, pl);
+__percpu_counter_add(&amp;amp;pl-&amp;gt;events, 1, PROP_BATCH);
+percpu_counter_add(&amp;amp;p-&amp;gt;events, 1);
+}
+
+void fprop_fraction_percpu(struct fprop_global *p,
+   struct fprop_local_percpu *pl,
+   unsigned long *numerator, unsigned long *denominator)
+{
+unsigned int seq;
+s64 num, den;
+
+do {
+seq = read_seqcount_begin(&amp;amp;p-&amp;gt;sequence);
+fprop_reflect_period_percpu(p, pl);
+num = percpu_counter_read_positive(&amp;amp;pl-&amp;gt;events);
+den = percpu_counter_read_positive(&amp;amp;p-&amp;gt;events);
+} while (read_seqcount_retry(&amp;amp;p-&amp;gt;sequence, seq));
+
+/*
+ * Make fraction &amp;lt;= 1 and denominator &amp;gt; 0 even in presence of percpu
+ * counter errors
+ */
+if (den &amp;lt;= num) {
+if (num)
+den = num;
+else
+den = 1;
+}
+*denominator = den;
+*numerator = num;
+}
+
+/*
+ * Like __fprop_inc_percpu() except that event is counted only if the given
+ * type has fraction smaller than &amp;lt; at &amp;gt;max_frac/FPROP_FRAC_BASE
+ */
+void __fprop_inc_percpu_max(struct fprop_global *p,
+    struct fprop_local_percpu *pl, int max_frac)
+{
+if (unlikely(max_frac &amp;lt; FPROP_FRAC_BASE)) {
+unsigned long numerator, denominator;
+
+fprop_fraction_percpu(p, pl, &amp;amp;numerator, &amp;amp;denominator);
+if (numerator &amp;gt;
+    (((u64)denominator) * max_frac) &amp;gt;&amp;gt; FPROP_FRAC_SHIFT)
+return;
+} else
+fprop_reflect_period_percpu(p, pl);
+__percpu_counter_add(&amp;amp;pl-&amp;gt;events, 1, PROP_BATCH);
+percpu_counter_add(&amp;amp;p-&amp;gt;events, 1);
+}
+
&lt;/pre&gt;</description>
    <dc:creator>Jan Kara</dc:creator>
    <dc:date>2012-05-24T16:59:10</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78951">
    <title>[PATCH 2/2] block: Convert BDI proportion calculations to flexible proportions</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78951</link>
    <description>&lt;pre&gt;Convert calculations of proportion of writeback each bdi does to new flexible
proportion code. That allows us to use aging period of fixed wallclock time
which gives better proportion estimates given the hugely varying throughput of
different devices.

Signed-off-by: Jan Kara &amp;lt;jack&amp;lt; at &amp;gt;suse.cz&amp;gt;
---
 include/linux/backing-dev.h |    4 +-
 mm/backing-dev.c            |    6 +-
 mm/page-writeback.c         |  103 ++++++++++++++++++++++++++----------------
 3 files changed, 69 insertions(+), 44 deletions(-)

diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index b1038bd..489de62 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -10,7 +10,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 
 #include &amp;lt;linux/percpu_counter.h&amp;gt;
 #include &amp;lt;linux/log2.h&amp;gt;
-#include &amp;lt;linux/proportions.h&amp;gt;
+#include &amp;lt;linux/flex_proportions.h&amp;gt;
 #include &amp;lt;linux/kernel.h&amp;gt;
 #include &amp;lt;linux/fs.h&amp;gt;
 #include &amp;lt;linux/sched.h&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -89,7 +89,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct backing_dev_info {
 unsigned long dirty_ratelimit;
 unsigned long balanced_dirty_ratelimit;
 
-struct prop_local_percpu completions;
+struct fprop_local_percpu completions;
 int dirty_exceeded;
 
 unsigned int min_ratio;
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index dd8e2aa..3387aea 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -677,7 +677,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int bdi_init(struct backing_dev_info *bdi)
 
 bdi-&amp;gt;min_ratio = 0;
 bdi-&amp;gt;max_ratio = 100;
-bdi-&amp;gt;max_prop_frac = PROP_FRAC_BASE;
+bdi-&amp;gt;max_prop_frac = FPROP_FRAC_BASE;
 spin_lock_init(&amp;amp;bdi-&amp;gt;wb_lock);
 INIT_LIST_HEAD(&amp;amp;bdi-&amp;gt;bdi_list);
 INIT_LIST_HEAD(&amp;amp;bdi-&amp;gt;work_list);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -700,7 +700,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int bdi_init(struct backing_dev_info *bdi)
 bdi-&amp;gt;write_bandwidth = INIT_BW;
 bdi-&amp;gt;avg_write_bandwidth = INIT_BW;
 
-err = prop_local_init_percpu(&amp;amp;bdi-&amp;gt;completions);
+err = fprop_local_init_percpu(&amp;amp;bdi-&amp;gt;completions);
 
 if (err) {
 err:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -744,7 +744,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void bdi_destroy(struct backing_dev_info *bdi)
 for (i = 0; i &amp;lt; NR_BDI_STAT_ITEMS; i++)
 percpu_counter_destroy(&amp;amp;bdi-&amp;gt;bdi_stat[i]);
 
-prop_local_destroy_percpu(&amp;amp;bdi-&amp;gt;completions);
+fprop_local_destroy_percpu(&amp;amp;bdi-&amp;gt;completions);
 }
 EXPORT_SYMBOL(bdi_destroy);
 
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 26adea8..647daa3 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,6 +34,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include &amp;lt;linux/syscalls.h&amp;gt;
 #include &amp;lt;linux/buffer_head.h&amp;gt; /* __set_page_dirty_buffers */
 #include &amp;lt;linux/pagevec.h&amp;gt;
+#include &amp;lt;linux/timer.h&amp;gt;
 #include &amp;lt;trace/events/writeback.h&amp;gt;
 
 /*
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -135,7 +136,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; unsigned long global_dirty_limit;
  * measured in page writeback completions.
  *
  */
-static struct prop_descriptor vm_completions;
+static struct fprop_global writeout_completions;
+
+static void writeout_period(unsigned long t);
+/* Timer for aging of writeout_completions */
+static struct timer_list writeout_period_timer =
+TIMER_DEFERRED_INITIALIZER(writeout_period, 0, 0);
+static unsigned long writeout_period_time = 0;
+
+/*
+ * Length of period for aging writeout fractions of bdis. This is an
+ * arbitrarily chosen number. The longer the period, the slower fractions will
+ * reflect changes in current writeout rate.
+ */
+#define VM_COMPLETIONS_PERIOD_LEN (3*HZ)
 
 /*
  * Work out the current dirty-memory clamping and background writeout
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -322,34 +336,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; bool zone_dirty_ok(struct zone *zone)
        zone_page_state(zone, NR_WRITEBACK) &amp;lt;= limit;
 }
 
-/*
- * couple the period to the dirty_ratio:
- *
- *   period/2 ~ roundup_pow_of_two(dirty limit)
- */
-static int calc_period_shift(void)
-{
-unsigned long dirty_total;
-
-if (vm_dirty_bytes)
-dirty_total = vm_dirty_bytes / PAGE_SIZE;
-else
-dirty_total = (vm_dirty_ratio * global_dirtyable_memory()) /
-100;
-return 2 + ilog2(dirty_total - 1);
-}
-
-/*
- * update the period when the dirty threshold changes.
- */
-static void update_completion_period(void)
-{
-int shift = calc_period_shift();
-prop_change_shift(&amp;amp;vm_completions, shift);
-
-writeback_set_ratelimit();
-}
-
 int dirty_background_ratio_handler(struct ctl_table *table, int write,
 void __user *buffer, size_t *lenp,
 loff_t *ppos)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -383,7 +369,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int dirty_ratio_handler(struct ctl_table *table, int write,
 
 ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
 if (ret == 0 &amp;amp;&amp;amp; write &amp;amp;&amp;amp; vm_dirty_ratio != old_ratio) {
-update_completion_period();
+writeback_set_ratelimit();
 vm_dirty_bytes = 0;
 }
 return ret;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -398,12 +384,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int dirty_bytes_handler(struct ctl_table *table, int write,
 
 ret = proc_doulongvec_minmax(table, write, buffer, lenp, ppos);
 if (ret == 0 &amp;amp;&amp;amp; write &amp;amp;&amp;amp; vm_dirty_bytes != old_bytes) {
-update_completion_period();
+writeback_set_ratelimit();
 vm_dirty_ratio = 0;
 }
 return ret;
 }
 
+static unsigned long wp_next_time(unsigned long cur_time)
+{
+cur_time += VM_COMPLETIONS_PERIOD_LEN;
+/* 0 has a special meaning... */
+if (!cur_time)
+return 1;
+return cur_time;
+}
+
 /*
  * Increment the BDI's writeout completion count and the global writeout
  * completion count. Called from test_clear_page_writeback().
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -411,8 +406,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int dirty_bytes_handler(struct ctl_table *table, int write,
 static inline void __bdi_writeout_inc(struct backing_dev_info *bdi)
 {
 __inc_bdi_stat(bdi, BDI_WRITTEN);
-__prop_inc_percpu_max(&amp;amp;vm_completions, &amp;amp;bdi-&amp;gt;completions,
-      bdi-&amp;gt;max_prop_frac);
+__fprop_inc_percpu_max(&amp;amp;writeout_completions, &amp;amp;bdi-&amp;gt;completions,
+       bdi-&amp;gt;max_prop_frac);
+/* First event after period switching was turned off? */
+if (!unlikely(writeout_period_time)) {
+/*
+ * We can race with other __bdi_writeout_inc calls here but
+ * it does not cause any harm since the resulting time when
+ * timer will fire and what is in writeout_period_time will be
+ * roughly the same.
+ */
+writeout_period_time = wp_next_time(jiffies);
+mod_timer(&amp;amp;writeout_period_timer, writeout_period_time);
+}
 }
 
 void bdi_writeout_inc(struct backing_dev_info *bdi)
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -431,11 +437,33 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; EXPORT_SYMBOL_GPL(bdi_writeout_inc);
 static void bdi_writeout_fraction(struct backing_dev_info *bdi,
 long *numerator, long *denominator)
 {
-prop_fraction_percpu(&amp;amp;vm_completions, &amp;amp;bdi-&amp;gt;completions,
+fprop_fraction_percpu(&amp;amp;writeout_completions, &amp;amp;bdi-&amp;gt;completions,
 numerator, denominator);
 }
 
 /*
+ * On idle system, we can be called long after we scheduled because we use
+ * deferred timers so count with missed periods.
+ */
+static void writeout_period(unsigned long t)
+{
+int miss_periods = (jiffies - writeout_period_time) /
+ VM_COMPLETIONS_PERIOD_LEN;
+
+if (fprop_new_period(&amp;amp;writeout_completions, miss_periods + 1)) {
+writeout_period_time = wp_next_time(writeout_period_time +
+miss_periods * VM_COMPLETIONS_PERIOD_LEN);
+mod_timer(&amp;amp;writeout_period_timer, writeout_period_time);
+} else {
+/*
+ * Aging has zeroed all fractions. Stop wasting CPU on period
+ * updates.
+ */
+writeout_period_time = 0;
+}
+}
+
+/*
  * bdi_min_ratio keeps the sum of the minimum dirty shares of all
  * registered backing devices, which, for obvious reasons, can not
  * exceed 100%.
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -475,7 +503,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned max_ratio)
 ret = -EINVAL;
 } else {
 bdi-&amp;gt;max_ratio = max_ratio;
-bdi-&amp;gt;max_prop_frac = (PROP_FRAC_BASE * max_ratio) / 100;
+bdi-&amp;gt;max_prop_frac = (FPROP_FRAC_BASE * max_ratio) / 100;
 }
 spin_unlock_bh(&amp;amp;bdi_lock);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1605,13 +1633,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static struct notifier_block __cpuinitdata ratelimit_nb = {
  */
 void __init page_writeback_init(void)
 {
-int shift;
-
 writeback_set_ratelimit();
 register_cpu_notifier(&amp;amp;ratelimit_nb);
 
-shift = calc_period_shift();
-prop_descriptor_init(&amp;amp;vm_completions, shift);
+fprop_global_init(&amp;amp;writeout_completions);
 }
 
 /**
&lt;/pre&gt;</description>
    <dc:creator>Jan Kara</dc:creator>
    <dc:date>2012-05-24T16:59:11</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78950">
    <title>the max size of block device on 32bit os,when using do_generic_file_read() proceed.</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78950</link>
    <description>&lt;pre&gt;  Hi all:
I readed a raid5,which size 30T.OS is RHEL6 32bit.
    I reaed the raid5(as a whole,not parted) and found read address which not i wanted.
So I tested the newest kernel code,the problem is still.
I review the code, in function do_generic_file_read()

index = *ppos &amp;gt;&amp;gt; PAGE_CACHE_SHIFT;
index is u32.and *ppos is long long.
So when *ppos is larger than 0xFFFF FFFF *  PAGE_CACHE_SHIFT(16T Byte),then the index is error.

I wonder this .In 32bit os ,block devices size do not large then 16T,in other words, if block devices larger than 16T,must parted.

Thanks all.
 
--------------
majianpeng
2012-05-24

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>majianpeng</dc:creator>
    <dc:date>2012-05-24T13:38:21</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78948">
    <title>Re: [PATCHv2 3/4] mm: vmalloc: add VM_DMA flag to indicate areas used by dma-mapping framework</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78948</link>
    <description>&lt;pre&gt;There's very little about the code in question that is ARM-specific to
begin with. I plan to adopt similar changes on SH once the work has
settled one way or the other, so we'll probably use the VMA flag there,
too.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo&amp;lt; at &amp;gt;kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: &amp;lt;a href=mailto:"dont&amp;lt; at &amp;gt;kvack.org"&amp;gt; email&amp;lt; at &amp;gt;kvack.org &amp;lt;/a&amp;gt;

&lt;/pre&gt;</description>
    <dc:creator>Paul Mundt</dc:creator>
    <dc:date>2012-05-24T12:28:54</dc:date>
  </item>
  <item rdf:about="http://permalink.gmane.org/gmane.linux.kernel.mm/78947">
    <title>RE: [PATCHv2 3/4] mm: vmalloc: add VM_DMA flag to indicate areas used by dma-mapping framework</title>
    <link>http://permalink.gmane.org/gmane.linux.kernel.mm/78947</link>
    <description>&lt;pre&gt;Hi Minchan,

On Tuesday, May 22, 2012 9:08 AM Minchan Kim wrote:


Right now yes, it will be used only on ARM architecture, but maybe other architecture will
start using it once it is available.


I've been told to avoid such #ifdef construction if there is no really good reason for it.
The only justification was significant impact on the performance, otherwise it would be 
just a good example of typical over-engineering.


Best regards
&lt;/pre&gt;</description>
    <dc:creator>Marek Szyprowski</dc:creator>
    <dc:date>2012-05-24T12:26:12</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.linux.kernel.mm">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.linux.kernel.mm</link>
  </textinput>
</rdf:RDF>

