[S390] pfault: delay register of pfault interrupt

Use an early init call to initialize pfault. That way it is possible to
use the register_external_interrupt() instead of the early variant.
No need to enable pfault any earlier since it has only effect if user
space processes are running.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Heiko Carstens 2011-01-05 12:47:39 +01:00 committed by Martin Schwidefsky
parent 62d146ffe3
commit fb0a9d7e86
3 changed files with 15 additions and 15 deletions

View File

@ -101,11 +101,9 @@ extern void account_vtime(struct task_struct *, struct task_struct *);
extern void account_tick_vtime(struct task_struct *); extern void account_tick_vtime(struct task_struct *);
#ifdef CONFIG_PFAULT #ifdef CONFIG_PFAULT
extern void pfault_irq_init(void);
extern int pfault_init(void); extern int pfault_init(void);
extern void pfault_fini(void); extern void pfault_fini(void);
#else /* CONFIG_PFAULT */ #else /* CONFIG_PFAULT */
#define pfault_irq_init() do { } while (0)
#define pfault_init() ({-1;}) #define pfault_init() ({-1;})
#define pfault_fini() do { } while (0) #define pfault_fini() do { } while (0)
#endif /* CONFIG_PFAULT */ #endif /* CONFIG_PFAULT */

View File

@ -733,5 +733,4 @@ void __init trap_init(void)
pgm_check_table[0x15] = &operand_exception; pgm_check_table[0x15] = &operand_exception;
pgm_check_table[0x1C] = &space_switch_exception; pgm_check_table[0x1C] = &space_switch_exception;
pgm_check_table[0x1D] = &hfp_sqrt_exception; pgm_check_table[0x1D] = &hfp_sqrt_exception;
pfault_irq_init();
} }

View File

@ -481,8 +481,7 @@ int __handle_fault(unsigned long uaddr, unsigned long pgm_int_code, int write)
/* /*
* 'pfault' pseudo page faults routines. * 'pfault' pseudo page faults routines.
*/ */
static ext_int_info_t ext_int_pfault; static int pfault_disable;
static int pfault_disable = 0;
static int __init nopfault(char *str) static int __init nopfault(char *str)
{ {
@ -594,24 +593,28 @@ static void pfault_interrupt(unsigned int ext_int_code,
} }
} }
void __init pfault_irq_init(void) static int __init pfault_irq_init(void)
{ {
if (!MACHINE_IS_VM) int rc;
return;
if (!MACHINE_IS_VM)
return 0;
/* /*
* Try to get pfault pseudo page faults going. * Try to get pfault pseudo page faults going.
*/ */
if (register_early_external_interrupt(0x2603, pfault_interrupt, rc = register_external_interrupt(0x2603, pfault_interrupt);
&ext_int_pfault) != 0) if (rc) {
panic("Couldn't request external interrupt 0x2603"); pfault_disable = 1;
return rc;
}
if (pfault_init() == 0) if (pfault_init() == 0)
return; return 0;
/* Tough luck, no pfault. */ /* Tough luck, no pfault. */
pfault_disable = 1; pfault_disable = 1;
unregister_early_external_interrupt(0x2603, pfault_interrupt, unregister_external_interrupt(0x2603, pfault_interrupt);
&ext_int_pfault); return 0;
} }
early_initcall(pfault_irq_init);
#endif #endif