From patchwork Tue Apr 14 01:37:41 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Robert Jennings X-Patchwork-Id: 25916 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id 70239DE198 for ; Tue, 14 Apr 2009 11:38:09 +1000 (EST) X-Original-To: linuxppc-dev@ozlabs.org Delivered-To: linuxppc-dev@ozlabs.org Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.153]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "e35.co.us.ibm.com", Issuer "Equifax" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id 813B3DDF7C for ; Tue, 14 Apr 2009 11:37:46 +1000 (EST) Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e35.co.us.ibm.com (8.13.1/8.13.1) with ESMTP id n3E1WWSV022463 for ; Mon, 13 Apr 2009 19:32:32 -0600 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v9.2) with ESMTP id n3E1bgPC232210 for ; Mon, 13 Apr 2009 19:37:42 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n3E1bgvH030442 for ; Mon, 13 Apr 2009 19:37:42 -0600 Received: from toy.austin.ibm.com (toy.austin.ibm.com [9.53.41.214]) by d03av04.boulder.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n3E1bfCN030432; Mon, 13 Apr 2009 19:37:42 -0600 Received: by toy.austin.ibm.com (Postfix, from userid 1000) id CD49DCCA068; Mon, 13 Apr 2009 20:37:41 -0500 (CDT) Date: Mon, 13 Apr 2009 20:37:41 -0500 From: Robert Jennings To: Paul Mackerras Subject: [PATCH] powerpc: VRM unused page hinting Message-ID: <20090414013741.GA8678@austin.ibm.com> Mail-Followup-To: Paul Mackerras , linuxppc-dev@ozlabs.org, Ben Herrenschmidt , Brian King MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.17+20080114 (2008-01-14) Cc: Brian King , linuxppc-dev@ozlabs.org X-BeenThere: linuxppc-dev@ozlabs.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@ozlabs.org Adds support for the "unused" page hint which can be used in shared memory partitions to flag pages not in use, which will then be stolen before active pages by the hypervisor when memory needs to be moved to LPARs in need of additional memory. Failure to mark pages as 'unused' makes the LPAR slower to give up unused memory to other partitions. Signed-off-by: Brian King Signed-off-by: Robert Jennings --- arch/powerpc/include/asm/page.h | 5 +++ arch/powerpc/platforms/pseries/lpar.c | 52 ++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) Index: b/arch/powerpc/include/asm/page.h =================================================================== --- a/arch/powerpc/include/asm/page.h +++ b/arch/powerpc/include/asm/page.h @@ -231,6 +231,11 @@ extern void copy_user_page(void *to, voi struct page *p); extern int page_is_ram(unsigned long pfn); +#ifdef CONFIG_PPC_SMLPAR +void arch_free_page(struct page *page, int order); +#define HAVE_ARCH_FREE_PAGE +#endif + struct vm_area_struct; typedef struct page *pgtable_t; Index: b/arch/powerpc/platforms/pseries/lpar.c =================================================================== --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c @@ -609,3 +609,55 @@ void __init hpte_init_lpar(void) ppc_md.flush_hash_range = pSeries_lpar_flush_hash_range; ppc_md.hpte_clear_all = pSeries_lpar_hptab_clear; } + +#ifdef CONFIG_PPC_SMLPAR +#define CMMA_DEFAULT 1 +static int cmma_flag = CMMA_DEFAULT; + +static int __init cmma(char *str) +{ + char *parm; + parm = strstrip(str); + + if (strcasecmp(parm, "no") == 0 || strcasecmp(parm, "off") == 0) { + printk(KERN_INFO "cmma: page marking is not active.\n"); + cmma_flag = 0; + return 1; + } + + cmma_flag = 1; + printk(KERN_INFO "cmma: page marking is active.\n"); + + if (strcasecmp(parm, "yes") == 0 || strcasecmp(parm, "on") == 0) + return 1; + + return 0; +} + +__setup("cmma=", cmma); + +static void pSeries_set_page_state(struct page *page, int order, + unsigned long state) +{ + int i, j; + unsigned long cmo_page_sz, addr; + + cmo_page_sz = cmo_get_page_size(); + addr = __pa((unsigned long)page_address(page)); + + for (i = 0; i < (1 << order); i++, addr += PAGE_SIZE) { + for (j = 0; j < PAGE_SIZE; j += cmo_page_sz) + plpar_hcall_norets(H_PAGE_INIT, state, addr + j, 0); + } +} + +void arch_free_page(struct page *page, int order) +{ + if (!cmma_flag || !firmware_has_feature(FW_FEATURE_CMO)) + return; + + pSeries_set_page_state(page, order, H_PAGE_SET_UNUSED); +} +EXPORT_SYMBOL(arch_free_page); + +#endif