From patchwork Sun Jan 30 03:15:49 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Huang, Ying" X-Patchwork-Id: 517131 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p0U5oJNO013186 for ; Sun, 30 Jan 2011 05:51:05 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752771Ab1A3DQZ (ORCPT ); Sat, 29 Jan 2011 22:16:25 -0500 Received: from mga02.intel.com ([134.134.136.20]:22257 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752433Ab1A3DQA (ORCPT ); Sat, 29 Jan 2011 22:16:00 -0500 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 29 Jan 2011 19:15:59 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.60,398,1291622400"; d="scan'208";a="597720047" Received: from yhuang-dev.sh.intel.com ([10.239.13.101]) by orsmga002.jf.intel.com with ESMTP; 29 Jan 2011 19:15:58 -0800 From: Huang Ying To: Avi Kivity , Marcelo Tosatti Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Andi Kleen , ying.huang@intel.com, Tony Luck , Dean Nelson , Andrew Morton Subject: [PATCH -v2 3/3] KVM, Replace is_hwpoison_address with __get_user_pages Date: Sun, 30 Jan 2011 11:15:49 +0800 Message-Id: <1296357349-18022-4-git-send-email-ying.huang@intel.com> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1296357349-18022-1-git-send-email-ying.huang@intel.com> References: <1296357349-18022-1-git-send-email-ying.huang@intel.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Sun, 30 Jan 2011 05:51:05 +0000 (UTC) --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1627,14 +1627,6 @@ extern int sysctl_memory_failure_recover extern void shake_page(struct page *p, int access); extern atomic_long_t mce_bad_pages; extern int soft_offline_page(struct page *page, int flags); -#ifdef CONFIG_MEMORY_FAILURE -int is_hwpoison_address(unsigned long addr); -#else -static inline int is_hwpoison_address(unsigned long addr) -{ - return 0; -} -#endif extern void dump_page(struct page *page); --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1437,35 +1437,3 @@ done: /* keep elevated page count for bad page */ return ret; } - -/* - * The caller must hold current->mm->mmap_sem in read mode. - */ -int is_hwpoison_address(unsigned long addr) -{ - pgd_t *pgdp; - pud_t pud, *pudp; - pmd_t pmd, *pmdp; - pte_t pte, *ptep; - swp_entry_t entry; - - pgdp = pgd_offset(current->mm, addr); - if (!pgd_present(*pgdp)) - return 0; - pudp = pud_offset(pgdp, addr); - pud = *pudp; - if (!pud_present(pud) || pud_large(pud)) - return 0; - pmdp = pmd_offset(pudp, addr); - pmd = *pmdp; - if (!pmd_present(pmd) || pmd_large(pmd)) - return 0; - ptep = pte_offset_map(pmdp, addr); - pte = *ptep; - pte_unmap(ptep); - if (!is_swap_pte(pte)) - return 0; - entry = pte_to_swp_entry(pte); - return is_hwpoison_entry(entry); -} -EXPORT_SYMBOL_GPL(is_hwpoison_address); --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1029,6 +1029,15 @@ static pfn_t get_fault_pfn(void) return fault_pfn; } +static inline int check_user_page_hwpoison(unsigned long addr) +{ + int rc, flags = FOLL_TOUCH | FOLL_HWPOISON | FOLL_WRITE; + + rc = __get_user_pages(current, current->mm, addr, 1, + flags, NULL, NULL, NULL); + return rc == -EHWPOISON; +} + static pfn_t hva_to_pfn(struct kvm *kvm, unsigned long addr, bool atomic, bool *async, bool write_fault, bool *writable) { @@ -1076,7 +1085,7 @@ static pfn_t hva_to_pfn(struct kvm *kvm, return get_fault_pfn(); down_read(¤t->mm->mmap_sem); - if (is_hwpoison_address(addr)) { + if (check_user_page_hwpoison(addr)) { up_read(¤t->mm->mmap_sem); get_page(hwpoison_page); return page_to_pfn(hwpoison_page);