x86/tss: Move I/O bitmap data into a seperate struct
authorThomas Gleixner <tglx@linutronix.de>
Tue, 12 Nov 2019 17:45:29 +0000 (18:45 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Sat, 16 Nov 2019 10:24:01 +0000 (11:24 +0100)
Move the non hardware portion of I/O bitmap data into a seperate struct for
readability sake.

Originally-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/common.c
arch/x86/kernel/ioport.c
arch/x86/kernel/process.c

index 6d0059c..cd7cd7d 100644 (file)
@@ -328,11 +328,11 @@ struct x86_hw_tss {
  * IO-bitmap sizes:
  */
 #define IO_BITMAP_BITS                 65536
-#define IO_BITMAP_BYTES                        (IO_BITMAP_BITS/8)
-#define IO_BITMAP_LONGS                        (IO_BITMAP_BYTES/sizeof(long))
+#define IO_BITMAP_BYTES                        (IO_BITMAP_BITS / BITS_PER_BYTE)
+#define IO_BITMAP_LONGS                        (IO_BITMAP_BYTES / sizeof(long))
 
-#define IO_BITMAP_OFFSET_VALID                         \
-       (offsetof(struct tss_struct, io_bitmap) -       \
+#define IO_BITMAP_OFFSET_VALID                                 \
+       (offsetof(struct tss_struct, io_bitmap.bitmap) -        \
         offsetof(struct tss_struct, x86_tss))
 
 /*
@@ -356,14 +356,10 @@ struct entry_stack_page {
        struct entry_stack stack;
 } __aligned(PAGE_SIZE);
 
-struct tss_struct {
-       /*
-        * The fixed hardware portion.  This must not cross a page boundary
-        * at risk of violating the SDM's advice and potentially triggering
-        * errata.
-        */
-       struct x86_hw_tss       x86_tss;
-
+/*
+ * All IO bitmap related data stored in the TSS:
+ */
+struct x86_io_bitmap {
        /*
         * Store the dirty size of the last io bitmap offender. The next
         * one will have to do the cleanup as the switch out to a non io
@@ -371,7 +367,7 @@ struct tss_struct {
         * outside of the TSS limit. So for sane tasks there is no need to
         * actually touch the io_bitmap at all.
         */
-       unsigned int            io_bitmap_prev_max;
+       unsigned int            prev_max;
 
        /*
         * The extra 1 is there because the CPU will access an
@@ -379,7 +375,18 @@ struct tss_struct {
         * bitmap. The extra byte must be all 1 bits, and must
         * be within the limit.
         */
-       unsigned long           io_bitmap[IO_BITMAP_LONGS + 1];
+       unsigned long           bitmap[IO_BITMAP_LONGS + 1];
+};
+
+struct tss_struct {
+       /*
+        * The fixed hardware portion.  This must not cross a page boundary
+        * at risk of violating the SDM's advice and potentially triggering
+        * errata.
+        */
+       struct x86_hw_tss       x86_tss;
+
+       struct x86_io_bitmap    io_bitmap;
 } __aligned(PAGE_SIZE);
 
 DECLARE_PER_CPU_PAGE_ALIGNED(struct tss_struct, cpu_tss_rw);
index 8c1000a..3aee167 100644 (file)
@@ -1861,8 +1861,8 @@ void cpu_init(void)
        /* Initialize the TSS. */
        tss_setup_ist(tss);
        tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_INVALID;
-       tss->io_bitmap_prev_max = 0;
-       memset(tss->io_bitmap, 0xff, sizeof(tss->io_bitmap));
+       tss->io_bitmap.prev_max = 0;
+       memset(tss->io_bitmap.bitmap, 0xff, sizeof(tss->io_bitmap.bitmap));
        set_tss_desc(cpu, &get_cpu_entry_area(cpu)->tss.x86_tss);
 
        load_TR_desc();
index eed218a..80d99bb 100644 (file)
@@ -81,9 +81,9 @@ long ksys_ioperm(unsigned long from, unsigned long num, int turn_on)
 
        /* Update the TSS */
        tss = this_cpu_ptr(&cpu_tss_rw);
-       memcpy(tss->io_bitmap, t->io_bitmap_ptr, bytes_updated);
+       memcpy(tss->io_bitmap.bitmap, t->io_bitmap_ptr, bytes_updated);
        /* Store the new end of the zero bits */
-       tss->io_bitmap_prev_max = bytes;
+       tss->io_bitmap.prev_max = bytes;
        /* Make the bitmap base in the TSS valid */
        tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_VALID;
        /* Make sure the TSS limit covers the I/O bitmap. */
index 2444fe2..35f1c80 100644 (file)
@@ -374,11 +374,11 @@ static inline void switch_to_bitmap(struct thread_struct *next,
                 * bits permitted, then the copy needs to cover those as
                 * well so they get turned off.
                 */
-               memcpy(tss->io_bitmap, next->io_bitmap_ptr,
-                      max(tss->io_bitmap_prev_max, next->io_bitmap_max));
+               memcpy(tss->io_bitmap.bitmap, next->io_bitmap_ptr,
+                      max(tss->io_bitmap.prev_max, next->io_bitmap_max));
 
                /* Store the new max and set io_bitmap_base valid */
-               tss->io_bitmap_prev_max = next->io_bitmap_max;
+               tss->io_bitmap.prev_max = next->io_bitmap_max;
                tss->x86_tss.io_bitmap_base = IO_BITMAP_OFFSET_VALID;
 
                /*