KVM: s390: fix task size check
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 26 Jul 2013 13:04:03 +0000 (15:04 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 29 Jul 2013 07:03:19 +0000 (09:03 +0200)
The gmap_map_segment function uses PGDIR_SIZE in the check for the
maximum address in the tasks address space. This incorrectly limits
the amount of memory usable for a kvm guest to 4TB. The correct limit
is (1UL << 53). As the TASK_SIZE has different values (4TB vs 8PB)
dependent on the existance of the fourth page table level, create
a new define 'TASK_MAX_SIZE' for (1UL << 53).

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/s390/include/asm/processor.h
arch/s390/mm/pgtable.c

index 6b499870662f2dddbb14dd613943ef10e6303b89..83c85c217f5ca3faa6e1dcecbe58caabb90c6941 100644 (file)
@@ -43,6 +43,7 @@ extern void execve_tail(void);
 #ifndef CONFIG_64BIT
 
 #define TASK_SIZE              (1UL << 31)
+#define TASK_MAX_SIZE          (1UL << 31)
 #define TASK_UNMAPPED_BASE     (1UL << 30)
 
 #else /* CONFIG_64BIT */
@@ -51,6 +52,7 @@ extern void execve_tail(void);
 #define TASK_UNMAPPED_BASE     (test_thread_flag(TIF_31BIT) ? \
                                        (1UL << 30) : (1UL << 41))
 #define TASK_SIZE              TASK_SIZE_OF(current)
+#define TASK_MAX_SIZE          (1UL << 53)
 
 #endif /* CONFIG_64BIT */
 
index 6d332487f363cd966792cd1be2d7a2bf58713f3e..967d0bf1c059593002acff3aca0bcbfeaa3824bd 100644 (file)
@@ -335,7 +335,7 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
 
        if ((from | to | len) & (PMD_SIZE - 1))
                return -EINVAL;
-       if (len == 0 || from + len > PGDIR_SIZE ||
+       if (len == 0 || from + len > TASK_MAX_SIZE ||
            from + len < from || to + len < to)
                return -EINVAL;