Commit f5848e5f authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

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: default avatarIngo Molnar <mingo@kernel.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent ecc7e37d
Loading
Loading
Loading
Loading
+21 −14
Original line number Diff line number Diff line
@@ -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_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) -	\
	(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.
 * All IO bitmap related data stored in the TSS:
 */
	struct x86_hw_tss	x86_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);
+2 −2
Original line number Diff line number Diff line
@@ -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();
+2 −2
Original line number Diff line number Diff line
@@ -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. */
+3 −3
Original line number Diff line number Diff line
@@ -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;

		/*