Thread (6 messages) 6 messages, 3 authors, 2016-02-24

Re: [patch 1/2] vmstat: Optimize refresh_cpu_vmstat()

From: Michal Hocko <hidden>
Date: 2016-02-24 17:38:29

On Mon 22-02-16 12:10:41, Christoph Lameter wrote:
Create a new function zone_needs_update() that uses a memchr to check
all diffs for being nonzero first.

If we use this function in refresh_cpu_vm_stat() then we can avoid the
this_cpu_xchg() loop over all differentials. This becomes in particular
important as the number of counters keeps on increasing.

This also avoids modifying the cachelines with the differentials
unnecessarily.

Also add some likely()s to ensure that the icache requirements
are low when we do not have any updates to process.
Do you have any numbers? Can you actually measure an interference of
refresh_cpu_vmstat?
quoted hunk ↗ jump to hunk
Signed-off-by: Christoph Lameter <redacted>

Index: linux/mm/vmstat.c
===================================================================
--- linux.orig/mm/vmstat.c	2016-02-22 11:54:02.179095030 -0600
+++ linux/mm/vmstat.c	2016-02-22 11:54:24.338528277 -0600
@@ -444,6 +444,18 @@ static int fold_diff(int *diff)
 	return changes;
 }
 
+bool zone_needs_update(struct per_cpu_pageset *p)
static bool ....
quoted hunk ↗ jump to hunk
+{
+
+	BUILD_BUG_ON(sizeof(p->vm_stat_diff[0]) != 1);
+	/*
+	 * The fast way of checking if there are any vmstat diffs.
+	 * This works because the diffs are byte sized items.
+	 */
+	return memchr_inv(p->vm_stat_diff, 0,
+			NR_VM_ZONE_STAT_ITEMS) != NULL;
+}
+
 /*
  * Update the zone counters for the current cpu.
  *
@@ -470,18 +482,20 @@ static int refresh_cpu_vm_stats(bool do_
 	for_each_populated_zone(zone) {
 		struct per_cpu_pageset __percpu *p = zone->pageset;
 
-		for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) {
-			int v;
+		if (unlikely(zone_needs_update(this_cpu_ptr(p)))) {
why unlikely? The generated code looks exactly same with or without it
(same for the other likely annotation added by this patch).

[...]
-- 
Michal Hocko
SUSE Labs

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help