[PATCH] ppc64: Remove lpqueue pointer from the paca on iSeries
authorMichael Ellerman <michael@ellerman.id.au>
Thu, 30 Jun 2005 05:07:09 +0000 (15:07 +1000)
committerPaul Mackerras <paulus@samba.org>
Thu, 30 Jun 2005 05:07:09 +0000 (15:07 +1000)
The iSeries code keeps a pointer to the ItLpQueue in its paca struct. But
all these pointers end up pointing to the one place, ie. xItLpQueue.

So remove the pointer from the paca struct and just refer to xItLpQueue
directly where needed.

The only complication is that the spread_lpevents logic was implemented by
having a NULL lpqueue pointer in the paca on CPUs that weren't supposed to
process events. Instead we just compare the spread_lpevents value to the
processor id to get the same behaviour.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Acked-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/ppc64/kernel/ItLpQueue.c
arch/ppc64/kernel/iSeries_setup.c
arch/ppc64/kernel/idle.c
arch/ppc64/kernel/irq.c
arch/ppc64/kernel/mf.c
arch/ppc64/kernel/pacaData.c
arch/ppc64/kernel/time.c
include/asm-ppc64/paca.h

index cdea00d7707f641e0dcabc4559ce90de101052ba..e90dca8bd1367ec775c1d983b931513226a83ab6 100644 (file)
@@ -69,15 +69,17 @@ struct HvLpEvent * ItLpQueue_getNextLpEvent( struct ItLpQueue * lpQueue )
        return nextLpEvent;
 }
 
+unsigned long spread_lpevents = 1;
+
 int ItLpQueue_isLpIntPending( struct ItLpQueue * lpQueue )
 {
-       int retval = 0;
-       struct HvLpEvent * nextLpEvent;
-       if ( lpQueue ) {
-               nextLpEvent = (struct HvLpEvent *)lpQueue->xSlicCurEventPtr;
-               retval = nextLpEvent->xFlags.xValid | lpQueue->xPlicOverflowIntPending;
-       }
-       return retval;
+       struct HvLpEvent *next_event;
+
+       if (smp_processor_id() >= spread_lpevents)
+               return 0;
+
+       next_event = (struct HvLpEvent *)lpQueue->xSlicCurEventPtr;
+       return next_event->xFlags.xValid | lpQueue->xPlicOverflowIntPending;
 }
 
 void ItLpQueue_clearValid( struct HvLpEvent * event )
index 86966ce76b58e26578322f67629f7ad590424091..2049b6dbafc739f2db655a8657f84b3df7a7406d 100644 (file)
@@ -855,17 +855,15 @@ late_initcall(iSeries_src_init);
 
 static int set_spread_lpevents(char *str)
 {
-       unsigned long i;
        unsigned long val = simple_strtoul(str, NULL, 0);
+       extern unsigned long spread_lpevents;
 
        /*
         * The parameter is the number of processors to share in processing
         * lp events.
         */
        if (( val > 0) && (val <= NR_CPUS)) {
-               for (i = 1; i < val; ++i)
-                       paca[i].lpqueue_ptr = paca[0].lpqueue_ptr;
-
+               spread_lpevents = val;
                printk("lpevent processing spread over %ld processors\n", val);
        } else {
                printk("invalid spread_lpevents %ld\n", val);
index bdf13b4dc1c832972733e907b6e68ab83704ff01..63977a7a3094b807f70643452446682b9e47e2c2 100644 (file)
@@ -88,7 +88,7 @@ static int iSeries_idle(void)
 
        while (1) {
                if (lpaca->lppaca.shared_proc) {
-                       if (ItLpQueue_isLpIntPending(lpaca->lpqueue_ptr))
+                       if (ItLpQueue_isLpIntPending(&xItLpQueue))
                                process_iSeries_events();
                        if (!need_resched())
                                yield_shared_processor();
@@ -100,7 +100,7 @@ static int iSeries_idle(void)
 
                                while (!need_resched()) {
                                        HMT_medium();
-                                       if (ItLpQueue_isLpIntPending(lpaca->lpqueue_ptr))
+                                       if (ItLpQueue_isLpIntPending(&xItLpQueue))
                                                process_iSeries_events();
                                        HMT_low();
                                }
index 3defc8c33adf567ad95988ec077174c992dc6ac3..b1e6acb02a9a7631c5a977eee302e6209573a9f5 100644 (file)
@@ -269,7 +269,6 @@ out:
 void do_IRQ(struct pt_regs *regs)
 {
        struct paca_struct *lpaca;
-       struct ItLpQueue *lpq;
 
        irq_enter();
 
@@ -295,9 +294,8 @@ void do_IRQ(struct pt_regs *regs)
                iSeries_smp_message_recv(regs);
        }
 #endif /* CONFIG_SMP */
-       lpq = lpaca->lpqueue_ptr;
-       if (lpq && ItLpQueue_isLpIntPending(lpq))
-               lpevent_count += ItLpQueue_process(lpq, regs);
+       if (ItLpQueue_isLpIntPending(&xItLpQueue))
+               lpevent_count += ItLpQueue_process(&xItLpQueue, regs);
 
        irq_exit();
 
index d98bebf7042faf990e63a8732c8dab4c91991033..d6a297a4feb3b9cfe7804a3a9030ff3fba574141 100644 (file)
@@ -802,9 +802,8 @@ int mf_get_boot_rtc(struct rtc_time *tm)
        /* We need to poll here as we are not yet taking interrupts */
        while (rtc_data.busy) {
                extern unsigned long lpevent_count;
-               struct ItLpQueue *lpq = get_paca()->lpqueue_ptr;
-               if (lpq && ItLpQueue_isLpIntPending(lpq))
-                       lpevent_count += ItLpQueue_process(lpq, NULL);
+               if (ItLpQueue_isLpIntPending(&xItLpQueue))
+                       lpevent_count += ItLpQueue_process(&xItLpQueue, NULL);
        }
        return rtc_set_tm(rtc_data.rc, rtc_data.ce_msg.ce_msg, tm);
 }
index a3e0975c26c1a9938fc30dee663a428801866e38..ebfb517019efe75d4276ef00772dfe2ae6ef8e85 100644 (file)
@@ -45,7 +45,6 @@ extern unsigned long __toc_start;
 #ifdef CONFIG_PPC_ISERIES
 #define EXTRA_INITS(number, lpq)                                           \
        .lppaca_ptr = &paca[number].lppaca,                                 \
-       .lpqueue_ptr = (lpq),           /* &xItLpQueue, */                  \
        .reg_save_ptr = &paca[number].reg_save,                             \
        .reg_save = {                                                       \
                .xDesc = 0xd397d9e2,    /* "LpRS" */                        \
index 2a532db9138a6176f891fed3fb1c4e5209ffa344..cdc43afb563e4b644b58d640bd44bcf0158f57b1 100644 (file)
@@ -367,11 +367,8 @@ int timer_interrupt(struct pt_regs * regs)
        set_dec(next_dec);
 
 #ifdef CONFIG_PPC_ISERIES
-       {
-               struct ItLpQueue *lpq = lpaca->lpqueue_ptr;
-               if (lpq && ItLpQueue_isLpIntPending(lpq))
-                       lpevent_count += ItLpQueue_process(lpq, regs);
-       }
+       if (ItLpQueue_isLpIntPending(&xItLpQueue))
+               lpevent_count += ItLpQueue_process(&xItLpQueue, regs);
 #endif
 
 /* collect purr register values often, for accurate calculations */
index ae76cae1483fad886c002fe33aec8166b2c1a5a7..0146f51684e993ba36ec3bb0f16ec863ece401fc 100644 (file)
@@ -20,7 +20,6 @@
 #include       <asm/types.h>
 #include       <asm/lppaca.h>
 #include       <asm/iSeries/ItLpRegSave.h>
-#include       <asm/iSeries/ItLpQueue.h>
 #include       <asm/mmu.h>
 
 register struct paca_struct *local_paca asm("r13");
@@ -62,7 +61,6 @@ struct paca_struct {
        u16 paca_index;                 /* Logical processor number */
 
        u32 default_decr;               /* Default decrementer value */
-       struct ItLpQueue *lpqueue_ptr;  /* LpQueue handled by this CPU */
        u64 kernel_toc;                 /* Kernel TOC address */
        u64 stab_real;                  /* Absolute address of segment table */
        u64 stab_addr;                  /* Virtual address of segment table */