Skip to contentSkip to conversation

fix register_sysrq() in 2.4.9++

PATCH In review Randy.Dunlap 3 participants 8 messages Sep 20, 2001 – Sep 24, 2001 TTY layer and serial drivers

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 fix register_sysrq() in 2.4.9++

Linus, Alan-

register_sysrq_key() is typed #ifdef CONFIG_MAGIC_SYSRQ, but untyped if it's not defined, causing problems for callers when CONFIG_MAGIC_SYSRQ is not defined.
This patch fixes that problem.

arch/i386/kernel/apm.c calls [un]register_sysrq_key() with a pointer to a sysrq_poweroff_op data structure that is only declared #ifdef CONFIG_MAGIC_SYSRQ.
This patch also wraps the register/unregister calls with #ifdef CONFIG_MAGIC_SYSRQ.

~Randy

include/linux/sysrq.h renamed from include/linux/sysrq.h.org +11 -2
@@ -87,8 +87,17 @@
 }
 
 #else
-#define register_sysrq_key(a,b)		do {} while(0)
-#define unregister_sysrq_key(a,b)	do {} while(0)
+
+static inline int register_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return -1;
+}
+
+static inline int unregister_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return 0;
+}
+
 #endif
 
 /* Deferred actions */
arch/i386/kernel/apm.c renamed from arch/i386/kernel/apm.c.org +6 -1
@@ -1564,7 +1564,10 @@
 	/* Install our power off handler.. */
 	if (power_off)
 		pm_power_off = apm_power_off;
-	register_sysrq_key('o',&sysrq_poweroff_op);
+#ifdef CONFIG_MAGIC_SYSRQ
+	if (register_sysrq_key('o',&sysrq_poweroff_op))
+		printk (KERN_ERR "Error: cannot register APM PowerOff SysRq key\n");
+#endif
 
 	if (smp_num_cpus == 1) {
 #if defined(CONFIG_APM_DISPLAY_BLANK) && defined(CONFIG_VT)
@@ -1780,7 +1783,9 @@
 	}
 	misc_deregister(&apm_device);
 	remove_proc_entry("apm", NULL);
+#ifdef CONFIG_MAGIC_SYSRQ
 	unregister_sysrq_key('o',&sysrq_poweroff_op);
+#endif
 	if (power_off)
 		pm_power_off = NULL;
 	exit_kapmd = 1;
#1 lore raw

u> +

include/linux/sysrq.h line 94

Quoted 4 lines
include/linux/sysrq.h renamed from include/linux/sysrq.h.org +4 -0
+static inline int register_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return -1;
+}

make it report ok as other non compiled in stuff does - then you can avoid masses of ifdefs

#2 lore raw
Quoted 9 lines · Alan Cox

u> +

include/linux/sysrq.h line 94

Quoted 4 lines
include/linux/sysrq.h renamed from include/linux/sysrq.h.org +4 -0
+static inline int register_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+     return -1;
+}

make it report ok as other non compiled in stuff does - then you can avoid masses of ifdefs

Yeah, I considered that, and it doesn't matter to me whether it reports 0 or -1, but it's the data pointer that (mostly) requires the #ifdefs, unless the data is always present or a dummy data pointer is used.... ?

~Randy

#3 lore raw
Quoted 4 lines

Yeah, I considered that, and it doesn't matter to me whether it reports 0 or -1, but it's the data pointer that (mostly) requires the #ifdefs, unless the data is always present or a dummy data pointer is used.... ?

#define it to an inline without some arguments ?

Alan

#4 lore raw
Quoted 7 lines · Alan Cox
Quoted 5 lines

Yeah, I considered that, and it doesn't matter to me whether it reports 0 or -1, but it's the data pointer that (mostly) requires the #ifdefs, unless the data is always present or a dummy data pointer is used.... ?

#define it to an inline without some arguments ?

~~~~~~~~~~~~~~~~~~
I can't get that to work, but someone else may be able to...

Here's another version for you to consider.

The [un]register_sysrq_key() calls return 0 when CONFIG_MAGIC_SYSRQ is not defined/configured.
However, it sacrifices one small data structure of 3 pointers.

~Randy

arch/i386/kernel/apm.c renamed from arch/i386/kernel/apm.c.org +2 -0
@@ -703,6 +703,8 @@
 	help_msg:       "Off",
 	action_msg:     "Power Off\n"
 };
+#else
+struct sysrq_key_op sysrq_poweroff_op;
 #endif
 
 
include/linux/sysrq.h renamed from include/linux/sysrq.h.org +11 -2
@@ -87,8 +87,17 @@
 }
 
 #else
-#define register_sysrq_key(a,b)		do {} while(0)
-#define unregister_sysrq_key(a,b)	do {} while(0)
+
+static inline int register_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return 0;
+}
+
+static inline int unregister_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return 0;
+}
+
 #endif
 
 /* Deferred actions */
#5 lore raw
In reply to Alan Cox

I'm not sure if this is sufficient. The low level interfaces need to be exposed, and if we are not expecting modules to pay attention to the CONFIG_MAGIC_SYSRQ setting, then the all of these interfaces need to be overridden.

However, do we even need this #ifdef CONFIG_MAGIC_SYSRQ block at all? What does it matter if modules register or unregister events, if they cannot be called?

The old code only zaped the enable if sysrq was not defined, and that is what I'm doing in the table. Some real changes would be neccessary to actually drop out the whole system.

There is also no real reason to try and no-op these functions for speed, as they are trivial and FAR outside of the main call path.

So the way to go I see here is:
a) allow the registration functions to always be defined.
and either:
b) handle the return failure in the __sysrq_XXX functions themselves,
c) or not.

++ 20/09/01 11:57 -0700 - Randy.Dunlap:

Quoted 51 lines
Quoted 7 lines · Alan Cox
Quoted 5 lines

Yeah, I considered that, and it doesn't matter to me whether it reports 0 or -1, but it's the data pointer that (mostly) requires the #ifdefs, unless the data is always present or a dummy data pointer is used.... ?

#define it to an inline without some arguments ?

~~~~~~~~~~~~~~~~~~
I can't get that to work, but someone else may be able to...

Here's another version for you to consider.

The [un]register_sysrq_key() calls return 0 when CONFIG_MAGIC_SYSRQ is not defined/configured.
However, it sacrifices one small data structure of 3 pointers.

~Randy

arch/i386/kernel/apm.c renamed from arch/i386/kernel/apm.c.org +2 -0
@@ -703,6 +703,8 @@
 	help_msg:       "Off",
 	action_msg:     "Power Off\n"
 };
+#else
+struct sysrq_key_op sysrq_poweroff_op;
 #endif
 
 
include/linux/sysrq.h renamed from include/linux/sysrq.h.org +11 -2
@@ -87,8 +87,17 @@
 }
 
 #else
-#define register_sysrq_key(a,b)		do {} while(0)
-#define unregister_sysrq_key(a,b)	do {} while(0)
+
+static inline int register_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return 0;
+}
+
+static inline int unregister_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return 0;
+}
+
 #endif
 
 /* Deferred actions */
Signature · 3 lines
Crutcher        <[email protected]>
GCS d--- s+:>+:- a-- C++++$ UL++++$ L+++$>++++ !E PS+++ PE Y+ PGP+>++++
    R-(+++) !tv(+++) b+(++++) G+ e>++++ h+>++ r* y+>*$
#6 lore raw

PATCH 1/1 Magic SysRq alternate fix register functions

In reply to Alan Cox

++ 21/09/01 18:22 -0400 - Crutcher Dunnavant:

Quoted 13 lines

I'm not sure if this is sufficient. The low level interfaces need to be exposed, and if we are not expecting modules to pay attention to the CONFIG_MAGIC_SYSRQ setting, then the all of these interfaces need to be overridden.

However, do we even need this #ifdef CONFIG_MAGIC_SYSRQ block at all? What does it matter if modules register or unregister events, if they cannot be called?

The old code only zaped the enable if sysrq was not defined, and that is what I'm doing in the table. Some real changes would be neccessary to actually drop out the whole system.

Quoted 8 lines

There is also no real reason to try and no-op these functions for speed, as they are trivial and FAR outside of the main call path.

So the way to go I see here is:
a) allow the registration functions to always be defined.
and either:
b) handle the return failure in the __sysrq_XXX functions themselves,
c) or not.

A 'dont-close-it' patch is attached.

Quoted 64 lines

++ 20/09/01 11:57 -0700 - Randy.Dunlap:

Quoted 51 lines
Quoted 7 lines · Alan Cox
Quoted 5 lines

Yeah, I considered that, and it doesn't matter to me whether it reports 0 or -1, but it's the data pointer that (mostly) requires the #ifdefs, unless the data is always present or a dummy data pointer is used.... ?

#define it to an inline without some arguments ?

~~~~~~~~~~~~~~~~~~
I can't get that to work, but someone else may be able to...

Here's another version for you to consider.

The [un]register_sysrq_key() calls return 0 when CONFIG_MAGIC_SYSRQ is not defined/configured.
However, it sacrifices one small data structure of 3 pointers.

~Randy

arch/i386/kernel/apm.c renamed from arch/i386/kernel/apm.c.org +2 -0
@@ -703,6 +703,8 @@
 	help_msg:       "Off",
 	action_msg:     "Power Off\n"
 };
+#else
+struct sysrq_key_op sysrq_poweroff_op;
 #endif
 
 
include/linux/sysrq.h renamed from include/linux/sysrq.h.org +11 -2
@@ -87,8 +87,17 @@
 }
 
 #else
-#define register_sysrq_key(a,b)		do {} while(0)
-#define unregister_sysrq_key(a,b)	do {} while(0)
+
+static inline int register_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return 0;
+}
+
+static inline int unregister_sysrq_key(int key, struct sysrq_key_op *op_p)
+{
+	return 0;
+}
+
 #endif
 
 /* Deferred actions */
Signature · 8 lines
Crutcher        <[email protected]>
GCS d--- s+:>+:- a-- C++++$ UL++++$ L+++$>++++ !E PS+++ PE Y+ PGP+>++++
    R-(+++) !tv(+++) b+(++++) G+ e>++++ h+>++ r* y+>*$
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
Signature · 3 lines
Crutcher        <[email protected]>
GCS d--- s+:>+:- a-- C++++$ UL++++$ L+++$>++++ !E PS+++ PE Y+ PGP+>++++
    R-(+++) !tv(+++) b+(++++) G+ e>++++ h+>++ r* y+>*$
include/linux/sysrq.h renamed from include/linux/sysrq.h.fix_sysrq +2 -7
@@ -42,7 +42,6 @@
                 struct kbd_struct *, struct tty_struct *);
 
 
-#ifdef CONFIG_MAGIC_SYSRQ
 
 /*
  * Sysrq registration manipulation functions
@@ -55,7 +54,8 @@
 
 extern __inline__ int
 __sysrq_swap_key_ops_nolock(int key, struct sysrq_key_op *insert_op_p,
-				struct sysrq_key_op *remove_op_p) {
+				struct sysrq_key_op *remove_op_p)
+{
 	int retval;
 	if (__sysrq_get_key_op(key) == remove_op_p) {
 		__sysrq_put_key_op(key, insert_op_p);
@@ -86,11 +86,6 @@
 	return __sysrq_swap_key_ops(key, NULL, op_p);
 }
 
-#else
-#define register_sysrq_key(a,b)		do {} while(0)
-#define unregister_sysrq_key(a,b)	do {} while(0)
-#endif
-
 /* Deferred actions */
 
 extern int emergency_sync_scheduled;
arch/i386/kernel/apm.c renamed from arch/i386/kernel/apm.c.fix_sysrq +0 -2
@@ -689,7 +689,6 @@
 		(void) apm_set_power_state(APM_STATE_OFF);
 }
 
-#ifdef CONFIG_MAGIC_SYSRQ
 /*
  * Magic sysrq key and handler for the power off function
  */
@@ -703,7 +702,6 @@
 	help_msg:       "Off",
 	action_msg:     "Power Off\n"
 };
-#endif
 
 
 #ifdef CONFIG_APM_DO_ENABLE
#7 lore raw

Re: [PATCH] Magic SysRq alternate fix register functions

In reply to Alan Cox
Quoted 24 lines · Crutcher Dunnavant

++ 21/09/01 18:22 -0400 - Crutcher Dunnavant:

Quoted 13 lines

I'm not sure if this is sufficient. The low level interfaces need to be exposed, and if we are not expecting modules to pay attention to the CONFIG_MAGIC_SYSRQ setting, then the all of these interfaces need to be overridden.

However, do we even need this #ifdef CONFIG_MAGIC_SYSRQ block at all? What does it matter if modules register or unregister events, if they cannot be called?

The old code only zaped the enable if sysrq was not defined, and that is what I'm doing in the table. Some real changes would be neccessary to actually drop out the whole system.

Quoted 8 lines

There is also no real reason to try and no-op these functions for speed, as they are trivial and FAR outside of the main call path.

So the way to go I see here is:
a) allow the registration functions to always be defined.
and either:
b) handle the return failure in the __sysrq_XXX functions themselves,
c) or not.

Quoted 6 lines

A 'dont-close-it' patch is attached.

----------------------------------------------------------------------
Name: patch-2.4.10-pre13-sysrq_register
patch-2.4.10-pre13-sysrq_register Type: Plain Text (text/plain)
Description: patch-2.4.10-pre13-sysrq_register

Yep, that certainly fixes the API when CONFIG_MAGIC_SYSRQ is not defined, which is what I wanted to see.

~Randy