diff options
-rw-r--r-- | arch/ppc64/kernel/ItLpQueue.c | 16 | ||||
-rw-r--r-- | arch/ppc64/kernel/iSeries_setup.c | 6 | ||||
-rw-r--r-- | arch/ppc64/kernel/idle.c | 4 | ||||
-rw-r--r-- | arch/ppc64/kernel/irq.c | 6 | ||||
-rw-r--r-- | arch/ppc64/kernel/mf.c | 5 | ||||
-rw-r--r-- | arch/ppc64/kernel/pacaData.c | 1 | ||||
-rw-r--r-- | arch/ppc64/kernel/time.c | 7 | ||||
-rw-r--r-- | include/asm-ppc64/paca.h | 2 |
8 files changed, 19 insertions, 28 deletions
diff --git a/arch/ppc64/kernel/ItLpQueue.c b/arch/ppc64/kernel/ItLpQueue.c index cdea00d7707f..e90dca8bd136 100644 --- a/arch/ppc64/kernel/ItLpQueue.c +++ b/arch/ppc64/kernel/ItLpQueue.c | |||
@@ -69,15 +69,17 @@ struct HvLpEvent * ItLpQueue_getNextLpEvent( struct ItLpQueue * lpQueue ) | |||
69 | return nextLpEvent; | 69 | return nextLpEvent; |
70 | } | 70 | } |
71 | 71 | ||
72 | unsigned long spread_lpevents = 1; | ||
73 | |||
72 | int ItLpQueue_isLpIntPending( struct ItLpQueue * lpQueue ) | 74 | int ItLpQueue_isLpIntPending( struct ItLpQueue * lpQueue ) |
73 | { | 75 | { |
74 | int retval = 0; | 76 | struct HvLpEvent *next_event; |
75 | struct HvLpEvent * nextLpEvent; | 77 | |
76 | if ( lpQueue ) { | 78 | if (smp_processor_id() >= spread_lpevents) |
77 | nextLpEvent = (struct HvLpEvent *)lpQueue->xSlicCurEventPtr; | 79 | return 0; |
78 | retval = nextLpEvent->xFlags.xValid | lpQueue->xPlicOverflowIntPending; | 80 | |
79 | } | 81 | next_event = (struct HvLpEvent *)lpQueue->xSlicCurEventPtr; |
80 | return retval; | 82 | return next_event->xFlags.xValid | lpQueue->xPlicOverflowIntPending; |
81 | } | 83 | } |
82 | 84 | ||
83 | void ItLpQueue_clearValid( struct HvLpEvent * event ) | 85 | void ItLpQueue_clearValid( struct HvLpEvent * event ) |
diff --git a/arch/ppc64/kernel/iSeries_setup.c b/arch/ppc64/kernel/iSeries_setup.c index 86966ce76b58..2049b6dbafc7 100644 --- a/arch/ppc64/kernel/iSeries_setup.c +++ b/arch/ppc64/kernel/iSeries_setup.c | |||
@@ -855,17 +855,15 @@ late_initcall(iSeries_src_init); | |||
855 | 855 | ||
856 | static int set_spread_lpevents(char *str) | 856 | static int set_spread_lpevents(char *str) |
857 | { | 857 | { |
858 | unsigned long i; | ||
859 | unsigned long val = simple_strtoul(str, NULL, 0); | 858 | unsigned long val = simple_strtoul(str, NULL, 0); |
859 | extern unsigned long spread_lpevents; | ||
860 | 860 | ||
861 | /* | 861 | /* |
862 | * The parameter is the number of processors to share in processing | 862 | * The parameter is the number of processors to share in processing |
863 | * lp events. | 863 | * lp events. |
864 | */ | 864 | */ |
865 | if (( val > 0) && (val <= NR_CPUS)) { | 865 | if (( val > 0) && (val <= NR_CPUS)) { |
866 | for (i = 1; i < val; ++i) | 866 | spread_lpevents = val; |
867 | paca[i].lpqueue_ptr = paca[0].lpqueue_ptr; | ||
868 | |||
869 | printk("lpevent processing spread over %ld processors\n", val); | 867 | printk("lpevent processing spread over %ld processors\n", val); |
870 | } else { | 868 | } else { |
871 | printk("invalid spread_lpevents %ld\n", val); | 869 | printk("invalid spread_lpevents %ld\n", val); |
diff --git a/arch/ppc64/kernel/idle.c b/arch/ppc64/kernel/idle.c index bdf13b4dc1c8..63977a7a3094 100644 --- a/arch/ppc64/kernel/idle.c +++ b/arch/ppc64/kernel/idle.c | |||
@@ -88,7 +88,7 @@ static int iSeries_idle(void) | |||
88 | 88 | ||
89 | while (1) { | 89 | while (1) { |
90 | if (lpaca->lppaca.shared_proc) { | 90 | if (lpaca->lppaca.shared_proc) { |
91 | if (ItLpQueue_isLpIntPending(lpaca->lpqueue_ptr)) | 91 | if (ItLpQueue_isLpIntPending(&xItLpQueue)) |
92 | process_iSeries_events(); | 92 | process_iSeries_events(); |
93 | if (!need_resched()) | 93 | if (!need_resched()) |
94 | yield_shared_processor(); | 94 | yield_shared_processor(); |
@@ -100,7 +100,7 @@ static int iSeries_idle(void) | |||
100 | 100 | ||
101 | while (!need_resched()) { | 101 | while (!need_resched()) { |
102 | HMT_medium(); | 102 | HMT_medium(); |
103 | if (ItLpQueue_isLpIntPending(lpaca->lpqueue_ptr)) | 103 | if (ItLpQueue_isLpIntPending(&xItLpQueue)) |
104 | process_iSeries_events(); | 104 | process_iSeries_events(); |
105 | HMT_low(); | 105 | HMT_low(); |
106 | } | 106 | } |
diff --git a/arch/ppc64/kernel/irq.c b/arch/ppc64/kernel/irq.c index 3defc8c33adf..b1e6acb02a9a 100644 --- a/arch/ppc64/kernel/irq.c +++ b/arch/ppc64/kernel/irq.c | |||
@@ -269,7 +269,6 @@ out: | |||
269 | void do_IRQ(struct pt_regs *regs) | 269 | void do_IRQ(struct pt_regs *regs) |
270 | { | 270 | { |
271 | struct paca_struct *lpaca; | 271 | struct paca_struct *lpaca; |
272 | struct ItLpQueue *lpq; | ||
273 | 272 | ||
274 | irq_enter(); | 273 | irq_enter(); |
275 | 274 | ||
@@ -295,9 +294,8 @@ void do_IRQ(struct pt_regs *regs) | |||
295 | iSeries_smp_message_recv(regs); | 294 | iSeries_smp_message_recv(regs); |
296 | } | 295 | } |
297 | #endif /* CONFIG_SMP */ | 296 | #endif /* CONFIG_SMP */ |
298 | lpq = lpaca->lpqueue_ptr; | 297 | if (ItLpQueue_isLpIntPending(&xItLpQueue)) |
299 | if (lpq && ItLpQueue_isLpIntPending(lpq)) | 298 | lpevent_count += ItLpQueue_process(&xItLpQueue, regs); |
300 | lpevent_count += ItLpQueue_process(lpq, regs); | ||
301 | 299 | ||
302 | irq_exit(); | 300 | irq_exit(); |
303 | 301 | ||
diff --git a/arch/ppc64/kernel/mf.c b/arch/ppc64/kernel/mf.c index d98bebf7042f..d6a297a4feb3 100644 --- a/arch/ppc64/kernel/mf.c +++ b/arch/ppc64/kernel/mf.c | |||
@@ -802,9 +802,8 @@ int mf_get_boot_rtc(struct rtc_time *tm) | |||
802 | /* We need to poll here as we are not yet taking interrupts */ | 802 | /* We need to poll here as we are not yet taking interrupts */ |
803 | while (rtc_data.busy) { | 803 | while (rtc_data.busy) { |
804 | extern unsigned long lpevent_count; | 804 | extern unsigned long lpevent_count; |
805 | struct ItLpQueue *lpq = get_paca()->lpqueue_ptr; | 805 | if (ItLpQueue_isLpIntPending(&xItLpQueue)) |
806 | if (lpq && ItLpQueue_isLpIntPending(lpq)) | 806 | lpevent_count += ItLpQueue_process(&xItLpQueue, NULL); |
807 | lpevent_count += ItLpQueue_process(lpq, NULL); | ||
808 | } | 807 | } |
809 | return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm); | 808 | return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm); |
810 | } | 809 | } |
diff --git a/arch/ppc64/kernel/pacaData.c b/arch/ppc64/kernel/pacaData.c index a3e0975c26c1..ebfb517019ef 100644 --- a/arch/ppc64/kernel/pacaData.c +++ b/arch/ppc64/kernel/pacaData.c | |||
@@ -45,7 +45,6 @@ extern unsigned long __toc_start; | |||
45 | #ifdef CONFIG_PPC_ISERIES | 45 | #ifdef CONFIG_PPC_ISERIES |
46 | #define EXTRA_INITS(number, lpq) \ | 46 | #define EXTRA_INITS(number, lpq) \ |
47 | .lppaca_ptr = &paca[number].lppaca, \ | 47 | .lppaca_ptr = &paca[number].lppaca, \ |
48 | .lpqueue_ptr = (lpq), /* &xItLpQueue, */ \ | ||
49 | .reg_save_ptr = &paca[number].reg_save, \ | 48 | .reg_save_ptr = &paca[number].reg_save, \ |
50 | .reg_save = { \ | 49 | .reg_save = { \ |
51 | .xDesc = 0xd397d9e2, /* "LpRS" */ \ | 50 | .xDesc = 0xd397d9e2, /* "LpRS" */ \ |
diff --git a/arch/ppc64/kernel/time.c b/arch/ppc64/kernel/time.c index 2a532db9138a..cdc43afb563e 100644 --- a/arch/ppc64/kernel/time.c +++ b/arch/ppc64/kernel/time.c | |||
@@ -367,11 +367,8 @@ int timer_interrupt(struct pt_regs * regs) | |||
367 | set_dec(next_dec); | 367 | set_dec(next_dec); |
368 | 368 | ||
369 | #ifdef CONFIG_PPC_ISERIES | 369 | #ifdef CONFIG_PPC_ISERIES |
370 | { | 370 | if (ItLpQueue_isLpIntPending(&xItLpQueue)) |
371 | struct ItLpQueue *lpq = lpaca->lpqueue_ptr; | 371 | lpevent_count += ItLpQueue_process(&xItLpQueue, regs); |
372 | if (lpq && ItLpQueue_isLpIntPending(lpq)) | ||
373 | lpevent_count += ItLpQueue_process(lpq, regs); | ||
374 | } | ||
375 | #endif | 372 | #endif |
376 | 373 | ||
377 | /* collect purr register values often, for accurate calculations */ | 374 | /* collect purr register values often, for accurate calculations */ |
diff --git a/include/asm-ppc64/paca.h b/include/asm-ppc64/paca.h index ae76cae1483f..0146f51684e9 100644 --- a/include/asm-ppc64/paca.h +++ b/include/asm-ppc64/paca.h | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <asm/types.h> | 20 | #include <asm/types.h> |
21 | #include <asm/lppaca.h> | 21 | #include <asm/lppaca.h> |
22 | #include <asm/iSeries/ItLpRegSave.h> | 22 | #include <asm/iSeries/ItLpRegSave.h> |
23 | #include <asm/iSeries/ItLpQueue.h> | ||
24 | #include <asm/mmu.h> | 23 | #include <asm/mmu.h> |
25 | 24 | ||
26 | register struct paca_struct *local_paca asm("r13"); | 25 | register struct paca_struct *local_paca asm("r13"); |
@@ -62,7 +61,6 @@ struct paca_struct { | |||
62 | u16 paca_index; /* Logical processor number */ | 61 | u16 paca_index; /* Logical processor number */ |
63 | 62 | ||
64 | u32 default_decr; /* Default decrementer value */ | 63 | u32 default_decr; /* Default decrementer value */ |
65 | struct ItLpQueue *lpqueue_ptr; /* LpQueue handled by this CPU */ | ||
66 | u64 kernel_toc; /* Kernel TOC address */ | 64 | u64 kernel_toc; /* Kernel TOC address */ |
67 | u64 stab_real; /* Absolute address of segment table */ | 65 | u64 stab_real; /* Absolute address of segment table */ |
68 | u64 stab_addr; /* Virtual address of segment table */ | 66 | u64 stab_addr; /* Virtual address of segment table */ |