Optimize i8259 code a bit.
PATCH 1/1 Optimize i8259 code a bit.
The timer code always calls the clock_event_device set_net_event and set_mode methods with interrupts disabled, so no need to use spin_lock_irqsave / spin_unlock_irqrestore for those.
arch/mips/kernel/i8253.c | 12 ++++-------- arch/x86/kernel/i8253.c | 12 ++++-------- 2 files changed, 8 insertions(+), 16 deletions(-)
arch/mips/kernel/i8253.c +4 -8
@@ -23,9 +23,7 @@ static DEFINE_SPINLOCK(i8253_lock);static void init_pit_timer (enum clock_event_mode mode,struct clock_event_device *evt) { -unsigned long flags; - -spin_lock_irqsave (&i8253_lock, flags); +spin_lock (&i8253_lock);switch (mode) {case CLOCK_EVT_MODE_PERIODIC :
@@ -54,7 +52,7 @@ static void init_pit_timer(enum clock_event_mode mode,/* Nothing to do here */ break ; } -spin_unlock_irqrestore (&i8253_lock, flags); +spin_unlock (&i8253_lock); }/*
@@ -64,12 +62,10 @@ static void init_pit_timer(enum clock_event_mode mode,*/ static int pit_next_event (unsigned long delta,struct clock_event_device *evt) { -unsigned long flags; - -spin_lock_irqsave (&i8253_lock, flags); +spin_lock (&i8253_lock);outb_p (delta &0xff ,PIT_CH0 );/* LSB */ outb (delta >>8 ,PIT_CH0 );/* MSB */ -spin_unlock_irqrestore (&i8253_lock, flags); +spin_unlock (&i8253_lock);return 0 ; }
arch/x86/kernel/i8253.c +4 -8
@@ -31,9 +31,7 @@ struct clock_event_device *global_clock_event;static void init_pit_timer (enum clock_event_mode mode,struct clock_event_device *evt) { -unsigned long flags; - -spin_lock_irqsave (&i8253_lock, flags); +spin_lock (&i8253_lock);switch (mode) {case CLOCK_EVT_MODE_PERIODIC :
@@ -62,7 +60,7 @@ static void init_pit_timer(enum clock_event_mode mode,/* Nothing to do here */ break ; } -spin_unlock_irqrestore (&i8253_lock, flags); +spin_unlock (&i8253_lock); }/*
@@ -72,12 +70,10 @@ static void init_pit_timer(enum clock_event_mode mode,*/ static int pit_next_event (unsigned long delta,struct clock_event_device *evt) { -unsigned long flags; - -spin_lock_irqsave (&i8253_lock, flags); +spin_lock (&i8253_lock);outb_p (delta &0xff ,PIT_CH0 );/* LSB */ outb (delta >>8 ,PIT_CH0 );/* MSB */ -spin_unlock_irqrestore (&i8253_lock, flags); +spin_unlock (&i8253_lock);return 0 ; }
Quoted 3 lines · Ralf Baechle
The timer code always calls the
clock_event_deviceset_net_eventandset_modemethods with interrupts disabled, so no need to usespin_lock_irqsave/spin_unlock_irqrestorefor those.
Good point,
Acked-by Thomas Gleixner <[email protected]>
Quoted 79 lines
arch/mips/kernel/i8253.c +4
-8@@ -23,9 +23,7 @@ static DEFINE_SPINLOCK(i8253_lock);static void init_pit_timer (enum clock_event_mode mode,struct clock_event_device *evt) { -unsigned long flags; - -spin_lock_irqsave (&i8253_lock, flags); +spin_lock (&i8253_lock);switch (mode) {case CLOCK_EVT_MODE_PERIODIC :@@ -54,7 +52,7 @@ static void init_pit_timer(enum clock_event_mode mode,/* Nothing to do here */ break ; } -spin_unlock_irqrestore (&i8253_lock, flags); +spin_unlock (&i8253_lock); }/* @@ -64,12 +62,10 @@ static void init_pit_timer(enum clock_event_mode mode,*/ static int pit_next_event (unsigned long delta,struct clock_event_device *evt) { -unsigned long flags; - -spin_lock_irqsave (&i8253_lock, flags); +spin_lock (&i8253_lock);outb_p (delta &0xff ,PIT_CH0 );/* LSB */ outb (delta >>8 ,PIT_CH0 );/* MSB */ -spin_unlock_irqrestore (&i8253_lock, flags); +spin_unlock (&i8253_lock);return 0 ; }arch/x86/kernel/i8253.c +4
-8@@ -31,9 +31,7 @@ struct clock_event_device *global_clock_event;static void init_pit_timer (enum clock_event_mode mode,struct clock_event_device *evt) { -unsigned long flags; - -spin_lock_irqsave (&i8253_lock, flags); +spin_lock (&i8253_lock);switch (mode) {case CLOCK_EVT_MODE_PERIODIC :@@ -62,7 +60,7 @@ static void init_pit_timer(enum clock_event_mode mode,/* Nothing to do here */ break ; } -spin_unlock_irqrestore (&i8253_lock, flags); +spin_unlock (&i8253_lock); }/* @@ -72,12 +70,10 @@ static void init_pit_timer(enum clock_event_mode mode,*/ static int pit_next_event (unsigned long delta,struct clock_event_device *evt) { -unsigned long flags; - -spin_lock_irqsave (&i8253_lock, flags); +spin_lock (&i8253_lock);outb_p (delta &0xff ,PIT_CH0 );/* LSB */ outb (delta >>8 ,PIT_CH0 );/* MSB */ -spin_unlock_irqrestore (&i8253_lock, flags); +spin_unlock (&i8253_lock);return 0 ; }