[tip: x86/iopl] x86/tss: Move I/O bitmap data into a seperate struct

From: tip-bot2 for Thomas Gleixner
Date: Sat Nov 16 2019 - 06:52:31 EST


The following commit has been merged into the x86/iopl branch of tip:

Commit-ID: f5848e5fd2f813c3a8009a642dfbcf635287c199
Gitweb: https://git.kernel.org/tip/f5848e5fd2f813c3a8009a642dfbcf635287c199
Author: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
AuthorDate: Tue, 12 Nov 2019 18:45:29 +01:00
Committer: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
CommitterDate: Sat, 16 Nov 2019 11:24:01 +01:00

x86/tss: Move I/O bitmap data into a seperate struct

Move the non hardware portion of I/O bitmap data into a seperate struct for
readability sake.

Originally-by: Ingo Molnar <mingo@xxxxxxxxxx>
Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
---
arch/x86/include/asm/processor.h | 35 ++++++++++++++++++-------------
arch/x86/kernel/cpu/common.c | 4 ++--
arch/x86/kernel/ioport.c | 4 ++--
arch/x86/kernel/process.c | 6 ++---
4 files changed, 28 insertions(+), 21 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 6d0059c..cd7cd7d 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -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);
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 8c1000a..3aee167 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -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();
diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c
index eed218a..80d99bb 100644
--- a/arch/x86/kernel/ioport.c
+++ b/arch/x86/kernel/ioport.c
@@ -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. */
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 2444fe2..35f1c80 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -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;

/*