long diff, f_diff, f_weight;
 
                        i = task_faults_idx(nid, priv);
-                       diff = -p->numa_faults_memory[i];
-                       f_diff = -p->numa_faults_cpu[i];
 
                        /* Decay existing window, copy faults since last scan */
-                       p->numa_faults_memory[i] >>= 1;
-                       p->numa_faults_memory[i] += p->numa_faults_buffer_memory[i];
+                       diff = p->numa_faults_buffer_memory[i] - p->numa_faults_memory[i] / 2;
                        fault_types[priv] += p->numa_faults_buffer_memory[i];
                        p->numa_faults_buffer_memory[i] = 0;
 
                        f_weight = div64_u64(runtime << 16, period + 1);
                        f_weight = (f_weight * p->numa_faults_buffer_cpu[i]) /
                                   (total_faults + 1);
-                       p->numa_faults_cpu[i] >>= 1;
-                       p->numa_faults_cpu[i] += f_weight;
+                       f_diff = f_weight - p->numa_faults_cpu[i] / 2;
                        p->numa_faults_buffer_cpu[i] = 0;
 
+                       p->numa_faults_memory[i] += diff;
+                       p->numa_faults_cpu[i] += f_diff;
                        faults += p->numa_faults_memory[i];
-                       diff += p->numa_faults_memory[i];
-                       f_diff += p->numa_faults_cpu[i];
                        p->total_numa_faults += diff;
                        if (p->numa_group) {
                                /* safe because we can only change our own group */