Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Remove the deprecated cli() sti() functions

These functions have been deprecated for some time now but remained until
all legacy callers could be removed. With a few commits in 2.6.26 this
has happened so now we can remove these deprecated functions.

Signed-off-by: Mark Asselstine <mark.asselstine@windriver.com>
Reviewed-by: Matthew Wilcox <willy@linux.intel.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Mark Asselstine and committed by
Linus Torvalds
f6ac436d 8cd68198

-164
-2
Documentation/00-INDEX
··· 89 89 - info, major/minor #'s for Compaq's SMART Array Controllers. 90 90 cdrom/ 91 91 - directory with information on the CD-ROM drivers that Linux has. 92 - cli-sti-removal.txt 93 - - cli()/sti() removal guide. 94 92 computone.txt 95 93 - info on Computone Intelliport II/Plus Multiport Serial Driver. 96 94 connector/
-133
Documentation/cli-sti-removal.txt
··· 1 - 2 - #### cli()/sti() removal guide, started by Ingo Molnar <mingo@redhat.com> 3 - 4 - 5 - as of 2.5.28, five popular macros have been removed on SMP, and 6 - are being phased out on UP: 7 - 8 - cli(), sti(), save_flags(flags), save_flags_cli(flags), restore_flags(flags) 9 - 10 - until now it was possible to protect driver code against interrupt 11 - handlers via a cli(), but from now on other, more lightweight methods 12 - have to be used for synchronization, such as spinlocks or semaphores. 13 - 14 - for example, driver code that used to do something like: 15 - 16 - struct driver_data; 17 - 18 - irq_handler (...) 19 - { 20 - .... 21 - driver_data.finish = 1; 22 - driver_data.new_work = 0; 23 - .... 24 - } 25 - 26 - ... 27 - 28 - ioctl_func (...) 29 - { 30 - ... 31 - cli(); 32 - ... 33 - driver_data.finish = 0; 34 - driver_data.new_work = 2; 35 - ... 36 - sti(); 37 - ... 38 - } 39 - 40 - was SMP-correct because the cli() function ensured that no 41 - interrupt handler (amongst them the above irq_handler()) function 42 - would execute while the cli()-ed section is executing. 43 - 44 - but from now on a more direct method of locking has to be used: 45 - 46 - DEFINE_SPINLOCK(driver_lock); 47 - struct driver_data; 48 - 49 - irq_handler (...) 50 - { 51 - unsigned long flags; 52 - .... 53 - spin_lock_irqsave(&driver_lock, flags); 54 - .... 55 - driver_data.finish = 1; 56 - driver_data.new_work = 0; 57 - .... 58 - spin_unlock_irqrestore(&driver_lock, flags); 59 - .... 60 - } 61 - 62 - ... 63 - 64 - ioctl_func (...) 65 - { 66 - ... 67 - spin_lock_irq(&driver_lock); 68 - ... 69 - driver_data.finish = 0; 70 - driver_data.new_work = 2; 71 - ... 72 - spin_unlock_irq(&driver_lock); 73 - ... 74 - } 75 - 76 - the above code has a number of advantages: 77 - 78 - - the locking relation is easier to understand - actual lock usage 79 - pinpoints the critical sections. cli() usage is too opaque. 80 - Easier to understand means it's easier to debug. 81 - 82 - - it's faster, because spinlocks are faster to acquire than the 83 - potentially heavily-used IRQ lock. Furthermore, your driver does 84 - not have to wait eg. for a big heavy SCSI interrupt to finish, 85 - because the driver_lock spinlock is only used by your driver. 86 - cli() on the other hand was used by many drivers, and extended 87 - the critical section to the whole IRQ handler function - creating 88 - serious lock contention. 89 - 90 - 91 - to make the transition easier, we've still kept the cli(), sti(), 92 - save_flags(), save_flags_cli() and restore_flags() macros defined 93 - on UP systems - but their usage will be phased out until 2.6 is 94 - released. 95 - 96 - drivers that want to disable local interrupts (interrupts on the 97 - current CPU), can use the following five macros: 98 - 99 - local_irq_disable(), local_irq_enable(), local_save_flags(flags), 100 - local_irq_save(flags), local_irq_restore(flags) 101 - 102 - but beware, their meaning and semantics are much simpler, far from 103 - that of the old cli(), sti(), save_flags(flags) and restore_flags(flags) 104 - SMP meaning: 105 - 106 - local_irq_disable() => turn local IRQs off 107 - 108 - local_irq_enable() => turn local IRQs on 109 - 110 - local_save_flags(flags) => save the current IRQ state into flags. The 111 - state can be on or off. (on some 112 - architectures there's even more bits in it.) 113 - 114 - local_irq_save(flags) => save the current IRQ state into flags and 115 - disable interrupts. 116 - 117 - local_irq_restore(flags) => restore the IRQ state from flags. 118 - 119 - (local_irq_save can save both irqs on and irqs off state, and 120 - local_irq_restore can restore into both irqs on and irqs off state.) 121 - 122 - another related change is that synchronize_irq() now takes a parameter: 123 - synchronize_irq(irq). This change too has the purpose of making SMP 124 - synchronization more lightweight - this way you can wait for your own 125 - interrupt handler to finish, no need to wait for other IRQ sources. 126 - 127 - 128 - why were these changes done? The main reason was the architectural burden 129 - of maintaining the cli()/sti() interface - it became a real problem. The 130 - new interrupt system is much more streamlined, easier to understand, debug, 131 - and it's also a bit faster - the same happened to it that will happen to 132 - cli()/sti() using drivers once they convert to spinlocks :-) 133 -
-29
include/linux/interrupt.h
··· 223 223 #define or_softirq_pending(x) (local_softirq_pending() |= (x)) 224 224 #endif 225 225 226 - /* 227 - * Temporary defines for UP kernels, until all code gets fixed. 228 - */ 229 - #ifndef CONFIG_SMP 230 - static inline void __deprecated cli(void) 231 - { 232 - local_irq_disable(); 233 - } 234 - static inline void __deprecated sti(void) 235 - { 236 - local_irq_enable(); 237 - } 238 - static inline void __deprecated save_flags(unsigned long *x) 239 - { 240 - local_save_flags(*x); 241 - } 242 - #define save_flags(x) save_flags(&x) 243 - static inline void __deprecated restore_flags(unsigned long x) 244 - { 245 - local_irq_restore(x); 246 - } 247 - 248 - static inline void __deprecated save_and_cli(unsigned long *x) 249 - { 250 - local_irq_save(*x); 251 - } 252 - #define save_and_cli(x) save_and_cli(&x) 253 - #endif /* CONFIG_SMP */ 254 - 255 226 /* Some architectures might implement lazy enabling/disabling of 256 227 * interrupts. In some cases, such as stop_machine, we might want 257 228 * to ensure that after a local_irq_disable(), interrupts have