Commit 409001948d9f221c94a61c3ee96de112755fc04d

Authored by Brian King
Committed by Paul Mackerras
1 parent 1ef8014deb

powerpc: Update page-in counter for CMM

A new field has been added to the VPA as a method for the client OS to
communicate to firmware the number of page-ins it is performing when
running collaborative memory overcommit.  The hypervisor will use this
information to better determine if a partition is experiencing memory
pressure and needs more memory allocated to it.

Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>

Showing 3 changed files with 13 additions and 3 deletions Side-by-side Diff

arch/powerpc/include/asm/lppaca.h
... ... @@ -133,7 +133,8 @@
133 133 //=============================================================================
134 134 // CACHE_LINE_4-5 0x0180 - 0x027F Contains PMC interrupt data
135 135 //=============================================================================
136   - u8 pmc_save_area[256]; // PMC interrupt Area x00-xFF
  136 + u32 page_ins; // CMO Hint - # page ins by OS x00-x04
  137 + u8 pmc_save_area[252]; // PMC interrupt Area x04-xFF
137 138 } __attribute__((__aligned__(0x400)));
138 139  
139 140 extern struct lppaca lppaca[];
arch/powerpc/kernel/paca.c
... ... @@ -37,6 +37,7 @@
37 37 .end_of_quantum = 0xfffffffffffffffful,
38 38 .slb_count = 64,
39 39 .vmxregs_in_use = 0,
  40 + .page_ins = 0,
40 41 },
41 42 };
42 43  
arch/powerpc/mm/fault.c
... ... @@ -30,6 +30,7 @@
30 30 #include <linux/kprobes.h>
31 31 #include <linux/kdebug.h>
32 32  
  33 +#include <asm/firmware.h>
33 34 #include <asm/page.h>
34 35 #include <asm/pgtable.h>
35 36 #include <asm/mmu.h>
36 37  
... ... @@ -318,9 +319,16 @@
318 319 goto do_sigbus;
319 320 BUG();
320 321 }
321   - if (ret & VM_FAULT_MAJOR)
  322 + if (ret & VM_FAULT_MAJOR) {
322 323 current->maj_flt++;
323   - else
  324 +#ifdef CONFIG_PPC_SMLPAR
  325 + if (firmware_has_feature(FW_FEATURE_CMO)) {
  326 + preempt_disable();
  327 + get_lppaca()->page_ins++;
  328 + preempt_enable();
  329 + }
  330 +#endif
  331 + } else
324 332 current->min_flt++;
325 333 up_read(&mm->mmap_sem);
326 334 return 0;