From patchwork Mon Jun 3 16:03:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 165664 Delivered-To: patch@linaro.org Received: by 2002:a92:9e1a:0:0:0:0:0 with SMTP id q26csp4660557ili; Mon, 3 Jun 2019 09:05:32 -0700 (PDT) X-Google-Smtp-Source: APXvYqxXcAAU54hvgC8IPWxeTU8D2JXmW09CNdKDjULqdEITxI43NCpLG0Al/JPoUQYRUem8ilKf X-Received: by 2002:a05:660c:7c3:: with SMTP id e3mr3180695itl.24.1559577932622; Mon, 03 Jun 2019 09:05:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559577932; cv=none; d=google.com; s=arc-20160816; b=sF7cxp9vCGiayms9iDAtt2BENHX9AFUl6QzsFpfjNLkU0J6kFe6p+4ZJJOtgHkMHna /5+KQdv6WKK+NF1IyO9TMIAXVN3bMCwS1GCOFwweHkVJvG9aajw+F7d2Kj4kxG5ibvl9 T+eVz2Xu78jdbYPfELlKChlhO4nOedzLM7pZLLmqfMzlqC4GJ4728vj1UIlFPWpHU2Qt QZhcNQK/KS31lvpMvI7kDtzINN/r6EeqYEijEfgDXdk60aaTwFdE4Wbhv3l2mx6Qnq0n AzhVGuGlTjbKh41BUgqqOrWhjkWQ2yUarckP1q4txUTOLFO3g5v3qQ+iWhJ3b+9pc5SI pjUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:references:in-reply-to:message-id:date:to:from; bh=A2SfxWTw5izmYCBs789HZzlm5vUf/hsbYJw4CxykJ24=; b=SBLIO0YET0OBPEMeF9rce4NzLuuyGNYWJNkZWBln8dhUrRXOdV3IjrdlzjT37yWkJ+ 8eOCvtl0tuewe8eUDoxMqYiS6ozli/ObVPeVIalndwB+CX39VxmbVJKqqQfHRlHWCIW1 Qk1DbhCWqohAlemL+8OYqskcCYRZOCMoAbc7+/hcky419T3fkJR9o5moE/1IU/9VxFHW w9YiQjnhSHszg7sGdI266cOmvx6ijvyT/vE/51rD55keqGkqxKKVOyohOQfm0+TC/ux7 VsNTsu22o4Qv/nGZgxfyDc6Sk5pcKbTh1yhfKax4TG4ysIAQ8+xmFfqsv5lTW0Pys2NE 80/A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id j21si9104822ioj.71.2019.06.03.09.05.32 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 03 Jun 2019 09:05:32 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hXpRR-0001wP-Sr; Mon, 03 Jun 2019 16:04:09 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hXpRQ-0001vx-Ev for xen-devel@lists.xenproject.org; Mon, 03 Jun 2019 16:04:08 +0000 X-Inumbo-ID: 3712eb4c-8619-11e9-8980-bc764e045a96 Received: from foss.arm.com (unknown [217.140.101.70]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTP id 3712eb4c-8619-11e9-8980-bc764e045a96; Mon, 03 Jun 2019 16:04:06 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6331880D; Mon, 3 Jun 2019 09:04:06 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.196.50]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 4F5553F246; Mon, 3 Jun 2019 09:04:04 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Mon, 3 Jun 2019 17:03:40 +0100 Message-Id: <20190603160350.29806-5-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20190603160350.29806-1-julien.grall@arm.com> References: <20190603160350.29806-1-julien.grall@arm.com> Subject: [Xen-devel] [PATCH v3 04/14] xen: Convert hotplug page function to use typesafe MFN X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Wei Liu , Konrad Rzeszutek Wilk , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich , =?utf-8?q?Ro?= =?utf-8?q?ger_Pau_Monn=C3=A9?= MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Convert online_page, offline_page and query_page_offline to use typesafe MFN. At the same time, the typesafe is propagated as far as possible without major modifications. Note, for clarity, the words have been re-ordered in the error message updated by this patch. No functional changes. Signed-off-by: Julien Grall Acked-by: Jan Beulich --- Changes in v3: - Mention in the commit message that the typesafe is propagated Changes in v2: - Update error message - Add Jan's acked-by --- xen/arch/x86/cpu/mcheck/mcaction.c | 18 ++++++++++-------- xen/common/page_alloc.c | 24 ++++++++++++------------ xen/common/sysctl.c | 14 +++++++------- xen/include/xen/mm.h | 6 +++--- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/xen/arch/x86/cpu/mcheck/mcaction.c b/xen/arch/x86/cpu/mcheck/mcaction.c index e42267414e..69332fb84d 100644 --- a/xen/arch/x86/cpu/mcheck/mcaction.c +++ b/xen/arch/x86/cpu/mcheck/mcaction.c @@ -6,7 +6,7 @@ static struct mcinfo_recovery * mci_action_add_pageoffline(int bank, struct mc_info *mi, - uint64_t mfn, uint32_t status) + mfn_t mfn, uint32_t status) { struct mcinfo_recovery *rec; @@ -22,7 +22,7 @@ mci_action_add_pageoffline(int bank, struct mc_info *mi, rec->mc_bank = bank; rec->action_types = MC_ACTION_PAGE_OFFLINE; - rec->action_info.page_retire.mfn = mfn; + rec->action_info.page_retire.mfn = mfn_x(mfn); rec->action_info.page_retire.status = status; return rec; } @@ -42,7 +42,8 @@ mc_memerr_dhandler(struct mca_binfo *binfo, struct mcinfo_bank *bank = binfo->mib; struct mcinfo_global *global = binfo->mig; struct domain *d; - unsigned long mfn, gfn; + mfn_t mfn; + unsigned long gfn; uint32_t status; int vmce_vcpuid; unsigned int mc_vcpuid; @@ -54,11 +55,12 @@ mc_memerr_dhandler(struct mca_binfo *binfo, return; } - mfn = bank->mc_addr >> PAGE_SHIFT; + mfn = maddr_to_mfn(bank->mc_addr); if ( offline_page(mfn, 1, &status) ) { dprintk(XENLOG_WARNING, - "Failed to offline page %lx for MCE error\n", mfn); + "Failed to offline page %"PRI_mfn" for MCE error\n", + mfn_x(mfn)); return; } @@ -89,10 +91,10 @@ mc_memerr_dhandler(struct mca_binfo *binfo, ASSERT(d); gfn = get_gpfn_from_mfn((bank->mc_addr) >> PAGE_SHIFT); - if ( unmmap_broken_page(d, _mfn(mfn), gfn) ) + if ( unmmap_broken_page(d, mfn, gfn) ) { - printk("Unmap broken memory %lx for DOM%d failed\n", - mfn, d->domain_id); + printk("Unmap broken memory %"PRI_mfn" for DOM%d failed\n", + mfn_x(mfn), d->domain_id); goto vmce_failed; } diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index 7825fd8c42..7075e084b4 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -1556,23 +1556,23 @@ static int reserve_heap_page(struct page_info *pg) } -int offline_page(unsigned long mfn, int broken, uint32_t *status) +int offline_page(mfn_t mfn, int broken, uint32_t *status) { unsigned long old_info = 0; struct domain *owner; struct page_info *pg; - if ( !mfn_valid(_mfn(mfn)) ) + if ( !mfn_valid(mfn) ) { dprintk(XENLOG_WARNING, - "try to offline page out of range %lx\n", mfn); + "try to offline out of range page %"PRI_mfn"\n", mfn_x(mfn)); return -EINVAL; } *status = 0; - pg = mfn_to_page(_mfn(mfn)); + pg = mfn_to_page(mfn); - if ( is_xen_fixed_mfn(mfn) ) + if ( is_xen_fixed_mfn(mfn_x(mfn)) ) { *status = PG_OFFLINE_XENPAGE | PG_OFFLINE_FAILED | (DOMID_XEN << PG_OFFLINE_OWNER_SHIFT); @@ -1583,7 +1583,7 @@ int offline_page(unsigned long mfn, int broken, uint32_t *status) * N.B. xen's txt in x86_64 is marked reserved and handled already. * Also kexec range is reserved. */ - if ( !page_is_ram_type(mfn, RAM_TYPE_CONVENTIONAL) ) + if ( !page_is_ram_type(mfn_x(mfn), RAM_TYPE_CONVENTIONAL) ) { *status = PG_OFFLINE_FAILED | PG_OFFLINE_NOT_CONV_RAM; return -EINVAL; @@ -1665,19 +1665,19 @@ int offline_page(unsigned long mfn, int broken, uint32_t *status) * The caller should make sure end_pfn <= max_page, * if not, expand_pages() should be called prior to online_page(). */ -unsigned int online_page(unsigned long mfn, uint32_t *status) +unsigned int online_page(mfn_t mfn, uint32_t *status) { unsigned long x, nx, y; struct page_info *pg; int ret; - if ( !mfn_valid(_mfn(mfn)) ) + if ( !mfn_valid(mfn) ) { dprintk(XENLOG_WARNING, "call expand_pages() first\n"); return -EINVAL; } - pg = mfn_to_page(_mfn(mfn)); + pg = mfn_to_page(mfn); spin_lock(&heap_lock); @@ -1718,11 +1718,11 @@ unsigned int online_page(unsigned long mfn, uint32_t *status) return ret; } -int query_page_offline(unsigned long mfn, uint32_t *status) +int query_page_offline(mfn_t mfn, uint32_t *status) { struct page_info *pg; - if ( !mfn_valid(_mfn(mfn)) || !page_is_ram_type(mfn, RAM_TYPE_CONVENTIONAL) ) + if ( !mfn_valid(mfn) || !page_is_ram_type(mfn_x(mfn), RAM_TYPE_CONVENTIONAL) ) { dprintk(XENLOG_WARNING, "call expand_pages() first\n"); return -EINVAL; @@ -1731,7 +1731,7 @@ int query_page_offline(unsigned long mfn, uint32_t *status) *status = 0; spin_lock(&heap_lock); - pg = mfn_to_page(_mfn(mfn)); + pg = mfn_to_page(mfn); if ( page_state_is(pg, offlining) ) *status |= PG_OFFLINE_STATUS_OFFLINE_PENDING; diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c index 765effde8d..fcf2d2fd7c 100644 --- a/xen/common/sysctl.c +++ b/xen/common/sysctl.c @@ -185,7 +185,7 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) case XEN_SYSCTL_page_offline_op: { uint32_t *status, *ptr; - unsigned long pfn; + mfn_t mfn; ret = xsm_page_offline(XSM_HOOK, op->u.page_offline.cmd); if ( ret ) @@ -204,21 +204,21 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl) memset(status, PG_OFFLINE_INVALID, sizeof(uint32_t) * (op->u.page_offline.end - op->u.page_offline.start + 1)); - for ( pfn = op->u.page_offline.start; - pfn <= op->u.page_offline.end; - pfn ++ ) + for ( mfn = _mfn(op->u.page_offline.start); + mfn_x(mfn) <= op->u.page_offline.end; + mfn = mfn_add(mfn, 1) ) { switch ( op->u.page_offline.cmd ) { /* Shall revert her if failed, or leave caller do it? */ case sysctl_page_offline: - ret = offline_page(pfn, 0, ptr++); + ret = offline_page(mfn, 0, ptr++); break; case sysctl_page_online: - ret = online_page(pfn, ptr++); + ret = online_page(mfn, ptr++); break; case sysctl_query_page_offline: - ret = query_page_offline(pfn, ptr++); + ret = query_page_offline(mfn, ptr++); break; default: ret = -EINVAL; diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h index 7fc3039593..196ce9fcda 100644 --- a/xen/include/xen/mm.h +++ b/xen/include/xen/mm.h @@ -206,9 +206,9 @@ unsigned long avail_domheap_pages(void); unsigned long avail_node_heap_pages(unsigned int); #define alloc_domheap_page(d,f) (alloc_domheap_pages(d,0,f)) #define free_domheap_page(p) (free_domheap_pages(p,0)) -unsigned int online_page(unsigned long mfn, uint32_t *status); -int offline_page(unsigned long mfn, int broken, uint32_t *status); -int query_page_offline(unsigned long mfn, uint32_t *status); +unsigned int online_page(mfn_t mfn, uint32_t *status); +int offline_page(mfn_t mfn, int broken, uint32_t *status); +int query_page_offline(mfn_t mfn, uint32_t *status); void heap_init_late(void);