]> Pileus Git - ~andy/linux/commitdiff
KVM: let the error pfn not depend on error code
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Fri, 3 Aug 2012 07:43:51 +0000 (15:43 +0800)
committerAvi Kivity <avi@redhat.com>
Mon, 6 Aug 2012 13:04:59 +0000 (16:04 +0300)
Currently, we use the error code as error pfn to indicat the error
condition, it is not straightforward and it will not work on PAE
32-bit cpu with huge memory, since the valid physical address
can be at most 52 bits

For the normal pfn, the highest 12 bits should be zero, so we can
mask these bits to indicate the error.

Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
include/linux/kvm_host.h

index 07226f820e6ccbbcc6856a49de870d3445ae89a0..d2b897ee3ac45126482962498c14ffbedc8217f6 100644 (file)
 #define KVM_MAX_MMIO_FRAGMENTS \
        (KVM_MMIO_SIZE / KVM_USER_MMIO_SIZE + KVM_EXTRA_MMIO_FRAGMENTS)
 
-#define KVM_PFN_ERR_FAULT      (-EFAULT)
-#define KVM_PFN_ERR_HWPOISON   (-EHWPOISON)
-#define KVM_PFN_ERR_BAD                (-ENOENT)
+/*
+ * For the normal pfn, the highest 12 bits should be zero,
+ * so we can mask these bits to indicate the error.
+ */
+#define KVM_PFN_ERR_MASK       (0xfffULL << 52)
+
+#define KVM_PFN_ERR_FAULT      (KVM_PFN_ERR_MASK)
+#define KVM_PFN_ERR_HWPOISON   (KVM_PFN_ERR_MASK + 1)
+#define KVM_PFN_ERR_BAD                (KVM_PFN_ERR_MASK + 2)
 
-static inline int is_error_pfn(pfn_t pfn)
+static inline bool is_error_pfn(pfn_t pfn)
 {
-       return IS_ERR_VALUE(pfn);
+       return !!(pfn & KVM_PFN_ERR_MASK);
 }
 
-static inline int is_noslot_pfn(pfn_t pfn)
+static inline bool is_noslot_pfn(pfn_t pfn)
 {
-       return pfn == -ENOENT;
+       return pfn == KVM_PFN_ERR_BAD;
 }
 
-static inline int is_invalid_pfn(pfn_t pfn)
+static inline bool is_invalid_pfn(pfn_t pfn)
 {
        return !is_noslot_pfn(pfn) && is_error_pfn(pfn);
 }
 
 #define KVM_ERR_PTR_BAD_PAGE   (ERR_PTR(-ENOENT))
 
-static inline int is_error_page(struct page *page)
+static inline bool is_error_page(struct page *page)
 {
        return IS_ERR(page);
 }