KVM: s390: vsie: gmap_table_walk() simplifications
authorDavid Hildenbrand <david@redhat.com>
Fri, 3 Apr 2020 15:30:50 +0000 (17:30 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 20 Apr 2020 09:33:31 +0000 (11:33 +0200)
Let's use asce_type where applicable. Also, simplify our sanity check for
valid table levels and convert it into a WARN_ON_ONCE(). Check if we even
have a valid gmap shadow as the very first step.

Signed-off-by: David Hildenbrand <david@redhat.com>
Link: https://lore.kernel.org/r/20200403153050.20569-6-david@redhat.com
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/mm/gmap.c

index 1a95d88..4b6903f 100644 (file)
@@ -788,19 +788,19 @@ static inline unsigned long *gmap_table_walk(struct gmap *gmap,
                                             unsigned long gaddr, int level)
 {
        const int asce_type = gmap->asce & _ASCE_TYPE_MASK;
-       unsigned long *table;
+       unsigned long *table = gmap->table;
 
-       if ((gmap->asce & _ASCE_TYPE_MASK) + 4 < (level * 4))
-               return NULL;
        if (gmap_is_shadow(gmap) && gmap->removed)
                return NULL;
 
+       if (WARN_ON_ONCE(level > (asce_type >> 2) + 1))
+               return NULL;
+
        if (asce_type != _ASCE_TYPE_REGION1 &&
            gaddr & (-1UL << (31 + (asce_type >> 2) * 11)))
                return NULL;
 
-       table = gmap->table;
-       switch (gmap->asce & _ASCE_TYPE_MASK) {
+       switch (asce_type) {
        case _ASCE_TYPE_REGION1:
                table += (gaddr & _REGION1_INDEX) >> _REGION1_SHIFT;
                if (level == 4)