2.4: introduce get_cpu() and put_cpu()
PATCH 1/1 2.4: introduce get_cpu() and put_cpu()
Master Marcelo,
In 2.5, it is unsafe to assume the current processor does not change out from under you - thus you must be atomic when calling smp_processor_id(). We introduced the get_cpu() and put_cpu() methods to provide a safe way to access the current processor.
This patch back-ports those interfaces to 2.4. Note they do nothing
special: get_cpu() simply returns smp_processor_id() and put_cpu() is a no-op. But this will allow easier back-porting from 2.5 and common code-base for drivers, etc. It also does not hurt to be explicit that you do not want the processor to change.
As an example, I converted one use of smp_processor_id() to the new interface.
Patch is against 2.4.20-pre9, please apply.
Robert Love
arch/i386/kernel/ioport.c +4 -1
@@ -55,12 +55,15 @@ asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on) {struct thread_struct * t = ¤t->thread; -struct tss_struct * tss = init_tss +smp_processor_id (); +struct tss_struct * tss;if ((from + num <= from) || (from + num >IO_BITMAP_SIZE *32 ))return -EINVAL ;if (turn_on && !capable (CAP_SYS_RAWIO ))return -EPERM ; + + tss = init_tss +get_cpu (); +/* * If it's the first ioperm() call in this thread's lifetime, set the * IO bitmap up. ioperm() is much less timing critical than clone(),
include/linux/smp.h +6 -2
@@ -87,5 +87,9 @@#define smp_call_function (func,info,retry,wait) ({ 0; })#define cpu_online_map 1 -#endif -#endif +#endif /* !CONFIG_SMP */ + +#define get_cpu () smp_processor_id() +#define put_cpu () do { } while(0) + +#endif /* __LINUX_SMP_H */
Quoted 11 lines · Robert Love
diff -urN
linux-2.4.20-pre9/arch/i386/kernel/ioport.clinux/arch/i386/kernel/ioport.carch/i386/kernel/ioport.c 2002-10-06 15:21:04.000000000 -0400 renamed from arch/i386/kernel/ioport.c 2002-10-06 14:58:01.000000000 -0400 +1
-1@@ -55,12 +55,15 @@ asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on) { struct thread_struct * t = ¤t->thread; - struct tss_struct * tss = init_tss + smp_processor_id(); + struct tss_struct * tss;
arch/i386/kernel/ioport.c 2002-10-06 15:21:04.000000000 -0400 line 69
Quoted 10 lines
arch/i386/kernel/ioport.c 2002-10-06 15:21:04.000000000 -0400 renamed from arch/i386/kernel/ioport.c 2002-10-06 14:58:01.000000000 -0400 +3
-0if ((from + num <= from) || (from + num > IO_BITMAP_SIZE*32)) return -EINVAL; if (turn_on && !capable(CAP_SYS_RAWIO)) return -EPERM; + + tss = init_tss + get_cpu(); + /* * If it's the first ioperm() call in this thread's lifetime, set the * IO bitmap up. ioperm() is much less timing critical than clone(),
To me it really looks like you are missing a put_cpu() call somewhere. I know it is a no-op, but since you intend to show how to use it, I it really ought to be there.
Does this look right?
arch/i386/kernel/ioport.c +2 -0
@@ -87,6 +87,8 @@set_bitmap (t->io_bitmap, from, num, !turn_on);set_bitmap (tss->io_bitmap, from, num, !turn_on); +put_cpu (); +return 0 ; }
Signature · 3 lines
Kasper Dupont -- der bruger for meget tid på usenet. For sending spam use mailto:[email protected] or mailto:[email protected]
Quoted 3 lines · Kasper Dupont
To me it really looks like you are missing a
put_cpu()call somewhere. I know it is a no-op, but since you intend to show how to use it, I it really ought to be there.
Whoops, you are right.
Quoted 1 line
Does this look right?
Yep, thanks.
Marcelo, attached patch is a resend with the missing put_cpu() included. Please, apply.
Robert Love
arch/i386/kernel/ioport.c +6 -1
@@ -55,12 +55,15 @@ asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int turn_on) {struct thread_struct * t = ¤t->thread; -struct tss_struct * tss = init_tss +smp_processor_id (); +struct tss_struct * tss;if ((from + num <= from) || (from + num >IO_BITMAP_SIZE *32 ))return -EINVAL ;if (turn_on && !capable (CAP_SYS_RAWIO ))return -EPERM ; + + tss = init_tss +get_cpu (); +/* * If it's the first ioperm() call in this thread's lifetime, set the * IO bitmap up. ioperm() is much less timing critical than clone(),
@@ -84,6 +87,8 @@set_bitmap (t->io_bitmap, from, num, !turn_on);set_bitmap (tss->io_bitmap, from, num, !turn_on); +put_cpu (); +return 0 ; }
include/linux/smp.h +6 -2
@@ -87,5 +87,9 @@#define smp_call_function (func,info,retry,wait) ({ 0; })#define cpu_online_map 1 -#endif -#endif +#endif /* !CONFIG_SMP */ + +#define get_cpu () smp_processor_id() +#define put_cpu () do { } while(0) + +#endif /* __LINUX_SMP_H */