x86: use switch() in _put_page_type()
authorJan Beulich <jbeulich@suse.com>
Fri, 15 Dec 2017 10:15:54 +0000 (11:15 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 15 Dec 2017 10:15:54 +0000 (11:15 +0100)
Use this to cheaply add another assertion.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
xen/arch/x86/mm.c

index 53a211e3bb2345a591a0dfbbf037ecabdfb1adcc..b8eb4feb6ba13b77a1809e22e25779fa454b2696 100644 (file)
@@ -2458,8 +2458,9 @@ static int _put_page_type(struct page_info *page, bool preemptible,
 
         ASSERT((x & PGT_count_mask) != 0);
 
-        if ( unlikely((nx & PGT_count_mask) == 0) )
+        switch ( nx & (PGT_locked | PGT_count_mask) )
         {
+        case 0:
             if ( unlikely((nx & PGT_type_mask) <= PGT_l4_page_table) &&
                  likely(nx & (PGT_validated|PGT_partial)) )
             {
@@ -2495,10 +2496,14 @@ static int _put_page_type(struct page_info *page, bool preemptible,
             }
             else
                 BUG_ON(!IS_ENABLED(CONFIG_PV_LINEAR_PT));
-        }
-        else if ( unlikely((nx & (PGT_locked | PGT_count_mask)) ==
-                           (PGT_locked | 1)) )
-        {
+
+            break;
+
+        case PGT_locked:
+            ASSERT_UNREACHABLE();
+            return -EILSEQ;
+
+        case PGT_locked | 1:
             /*
              * We must not drop the second to last reference when the page is
              * locked, as page_unlock() doesn't do any cleanup of the type.