Please add the following sparc bug fixes to 2.6.38-stable

Thanks!
>From 919a6006d36ab51a70ca5d80e192cba953c874cb Mon Sep 17 00:00:00 2001
From: Ben Hutchings <[email protected]>
Date: Wed, 9 Mar 2011 12:54:27 -0800
Subject: [PATCH 1/4] sparc: Fix .size directive for do_int_load

[ Upstream commit 35043c428f1fcb92feb5792f5878a8852ee00771 ]

gas used to accept (and ignore?) .size directives which referred to
undefined symbols, as this does.  In binutils 2.21 these are treated
as errors.

Signed-off-by: Ben Hutchings <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
---
 arch/sparc/kernel/una_asm_64.S |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/sparc/kernel/una_asm_64.S b/arch/sparc/kernel/una_asm_64.S
index be183fe..1c8d332 100644
--- a/arch/sparc/kernel/una_asm_64.S
+++ b/arch/sparc/kernel/una_asm_64.S
@@ -127,7 +127,7 @@ do_int_load:
        wr      %o5, 0x0, %asi
        retl
         mov    0, %o0
-       .size   __do_int_load, .-__do_int_load
+       .size   do_int_load, .-do_int_load
 
        .section        __ex_table,"a"
        .word           4b, __retl_efault
-- 
1.7.4.3


>From c90b2d78650ae1ec6db90f07533e0382fa63acad Mon Sep 17 00:00:00 2001
From: David S. Miller <[email protected]>
Date: Wed, 9 Mar 2011 13:00:47 -0800
Subject: [PATCH 2/4] sparc32: Fix might-be-used-uninitialized warning in 
do_sparc_fault().

[ Upstream commit c816be7b5f24585baa9eba1f2413935f771d6ad6 ]

When we try to handle vmalloc faults, we can take a code
path which uses "code" before we actually set it.

Amusingly gcc-3.3 notices this yet gcc-4.x does not.

Reported-by: Bob Breuer <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
---
 arch/sparc/mm/fault_32.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c
index 5b836f5..b10ac4d 100644
--- a/arch/sparc/mm/fault_32.c
+++ b/arch/sparc/mm/fault_32.c
@@ -240,11 +240,10 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int 
text_fault, int write,
         * only copy the information from the master page table,
         * nothing more.
         */
+       code = SEGV_MAPERR;
        if (!ARCH_SUN4C && address >= TASK_SIZE)
                goto vmalloc_fault;
 
-       code = SEGV_MAPERR;
-
        /*
         * If we're in an interrupt or have no user
         * context, we must not take the fault..
-- 
1.7.4.3


>From d4f295b7863f094b4d76ce10cb99f4617b5d00ad Mon Sep 17 00:00:00 2001
From: Tkhai Kirill <[email protected]>
Date: Thu, 31 Mar 2011 00:52:38 -0700
Subject: [PATCH 3/4] sparc32: Pass task_struct to schedule_tail() in 
ret_from_fork

[ Upstream commit 47c7c97a93a5b8f719093dbf83555090b3b8228b ]

We have to pass task_struct of previous process to function
schedule_tail(). Currently in ret_from_fork previous thread_info
is passed:

switch_to: mov %g6, %g3 /* previous thread_info in g6 */

ret_from_fork: call    schedule_tail
                mov    %g3, %o0 /* previous thread_info is passed */

void schedule_tail(struct task_struct *prev);

Signed-off-by: Tkhai Kirill <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
---
 arch/sparc/kernel/entry.S |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
index 1504df8..906ee3e 100644
--- a/arch/sparc/kernel/entry.S
+++ b/arch/sparc/kernel/entry.S
@@ -1283,7 +1283,7 @@ linux_syscall_trace:
        .globl  ret_from_fork
 ret_from_fork:
        call    schedule_tail
-        mov    %g3, %o0
+        ld     [%g3 + TI_TASK], %o0
        b       ret_sys_call
         ld     [%sp + STACKFRAME_SZ + PT_I0], %o0
 
-- 
1.7.4.3


>From 9567fc1bffdb332f7254c9bd2a913c80a6e18e16 Mon Sep 17 00:00:00 2001
From: David S. Miller <[email protected]>
Date: Sat, 26 Feb 2011 23:40:02 -0800
Subject: [PATCH 4/4] sparc64: Fix build errors with gcc-4.6.0

[ Upstream commit c6fee0810df4e0f4cf9c4834d2569ca01c02cffc ]

Most of the warnings emitted (we fail arch/sparc file
builds with -Werror) were legitimate but harmless, however
one case (n2_pcr_write) was a genuine bug.

Based almost entirely upon a patch by Sam Ravnborg.

Reported-by: Dennis Gilmore <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
---
 arch/sparc/kernel/iommu.c      |    3 ---
 arch/sparc/kernel/ldc.c        |   28 ++++++++++++++++++----------
 arch/sparc/kernel/pci.c        |    1 +
 arch/sparc/kernel/pci_common.c |   11 +++++++----
 arch/sparc/kernel/pci_fire.c   |    2 --
 arch/sparc/kernel/pci_schizo.c |    4 +---
 arch/sparc/kernel/pci_sun4v.c  |    3 +--
 arch/sparc/kernel/pcr.c        |    2 +-
 arch/sparc/kernel/ptrace_64.c  |    3 ++-
 arch/sparc/kernel/smp_64.c     |   11 ++++-------
 arch/sparc/kernel/traps_64.c   |    3 +--
 11 files changed, 36 insertions(+), 35 deletions(-)

diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c
index 72509d0..6f01e8c 100644
--- a/arch/sparc/kernel/iommu.c
+++ b/arch/sparc/kernel/iommu.c
@@ -333,13 +333,10 @@ static void dma_4u_free_coherent(struct device *dev, 
size_t size,
                                 void *cpu, dma_addr_t dvma)
 {
        struct iommu *iommu;
-       iopte_t *iopte;
        unsigned long flags, order, npages;
 
        npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT;
        iommu = dev->archdata.iommu;
-       iopte = iommu->page_table +
-               ((dvma - iommu->page_table_map_base) >> IO_PAGE_SHIFT);
 
        spin_lock_irqsave(&iommu->lock, flags);
 
diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c
index df39a0f..732b0bc 100644
--- a/arch/sparc/kernel/ldc.c
+++ b/arch/sparc/kernel/ldc.c
@@ -790,16 +790,20 @@ static void send_events(struct ldc_channel *lp, unsigned 
int event_mask)
 static irqreturn_t ldc_rx(int irq, void *dev_id)
 {
        struct ldc_channel *lp = dev_id;
-       unsigned long orig_state, hv_err, flags;
+       unsigned long orig_state, flags;
        unsigned int event_mask;
 
        spin_lock_irqsave(&lp->lock, flags);
 
        orig_state = lp->chan_state;
-       hv_err = sun4v_ldc_rx_get_state(lp->id,
-                                       &lp->rx_head,
-                                       &lp->rx_tail,
-                                       &lp->chan_state);
+
+       /* We should probably check for hypervisor errors here and
+        * reset the LDC channel if we get one.
+        */
+       sun4v_ldc_rx_get_state(lp->id,
+                              &lp->rx_head,
+                              &lp->rx_tail,
+                              &lp->chan_state);
 
        ldcdbg(RX, "RX state[0x%02lx:0x%02lx] head[0x%04lx] tail[0x%04lx]\n",
               orig_state, lp->chan_state, lp->rx_head, lp->rx_tail);
@@ -904,16 +908,20 @@ out:
 static irqreturn_t ldc_tx(int irq, void *dev_id)
 {
        struct ldc_channel *lp = dev_id;
-       unsigned long flags, hv_err, orig_state;
+       unsigned long flags, orig_state;
        unsigned int event_mask = 0;
 
        spin_lock_irqsave(&lp->lock, flags);
 
        orig_state = lp->chan_state;
-       hv_err = sun4v_ldc_tx_get_state(lp->id,
-                                       &lp->tx_head,
-                                       &lp->tx_tail,
-                                       &lp->chan_state);
+
+       /* We should probably check for hypervisor errors here and
+        * reset the LDC channel if we get one.
+        */
+       sun4v_ldc_tx_get_state(lp->id,
+                              &lp->tx_head,
+                              &lp->tx_tail,
+                              &lp->chan_state);
 
        ldcdbg(TX, " TX state[0x%02lx:0x%02lx] head[0x%04lx] tail[0x%04lx]\n",
               orig_state, lp->chan_state, lp->tx_head, lp->tx_tail);
diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c
index 4137579..f255382 100644
--- a/arch/sparc/kernel/pci.c
+++ b/arch/sparc/kernel/pci.c
@@ -675,6 +675,7 @@ static void __devinit pci_bus_register_of_sysfs(struct 
pci_bus *bus)
                 * humanoid.
                 */
                err = sysfs_create_file(&dev->dev.kobj, &dev_attr_obppath.attr);
+               (void) err;
        }
        list_for_each_entry(child_bus, &bus->children, node)
                pci_bus_register_of_sysfs(child_bus);
diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c
index 6c7a33a..6e3874b 100644
--- a/arch/sparc/kernel/pci_common.c
+++ b/arch/sparc/kernel/pci_common.c
@@ -295,14 +295,17 @@ static int sun4v_write_pci_cfg(struct pci_bus *bus_dev, 
unsigned int devfn,
        unsigned int bus = bus_dev->number;
        unsigned int device = PCI_SLOT(devfn);
        unsigned int func = PCI_FUNC(devfn);
-       unsigned long ret;
 
        if (config_out_of_range(pbm, bus, devfn, where)) {
                /* Do nothing. */
        } else {
-               ret = pci_sun4v_config_put(devhandle,
-                               HV_PCI_DEVICE_BUILD(bus, device, func),
-                               where, size, value);
+               /* We don't check for hypervisor errors here, but perhaps
+                * we should and influence our return value depending upon
+                * what kind of error is thrown.
+                */
+               pci_sun4v_config_put(devhandle,
+                                    HV_PCI_DEVICE_BUILD(bus, device, func),
+                                    where, size, value);
        }
        return PCIBIOS_SUCCESSFUL;
 }
diff --git a/arch/sparc/kernel/pci_fire.c b/arch/sparc/kernel/pci_fire.c
index efb896d..75dfeb6 100644
--- a/arch/sparc/kernel/pci_fire.c
+++ b/arch/sparc/kernel/pci_fire.c
@@ -214,11 +214,9 @@ static int pci_fire_msi_setup(struct pci_pbm_info *pbm, 
unsigned long msiqid,
 
 static int pci_fire_msi_teardown(struct pci_pbm_info *pbm, unsigned long msi)
 {
-       unsigned long msiqid;
        u64 val;
 
        val = upa_readq(pbm->pbm_regs + MSI_MAP(msi));
-       msiqid = (val & MSI_MAP_EQNUM);
 
        val &= ~MSI_MAP_VALID;
 
diff --git a/arch/sparc/kernel/pci_schizo.c b/arch/sparc/kernel/pci_schizo.c
index 445a47a..4620eb7 100644
--- a/arch/sparc/kernel/pci_schizo.c
+++ b/arch/sparc/kernel/pci_schizo.c
@@ -1313,7 +1313,7 @@ static int __devinit schizo_pbm_init(struct pci_pbm_info 
*pbm,
        const struct linux_prom64_registers *regs;
        struct device_node *dp = op->dev.of_node;
        const char *chipset_name;
-       int is_pbm_a, err;
+       int err;
 
        switch (chip_type) {
        case PBM_CHIP_TYPE_TOMATILLO:
@@ -1343,8 +1343,6 @@ static int __devinit schizo_pbm_init(struct pci_pbm_info 
*pbm,
         */
        regs = of_get_property(dp, "reg", NULL);
 
-       is_pbm_a = ((regs[0].phys_addr & 0x00700000) == 0x00600000);
-
        pbm->next = pci_pbm_root;
        pci_pbm_root = pbm;
 
diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c
index 743344a..859abfd 100644
--- a/arch/sparc/kernel/pci_sun4v.c
+++ b/arch/sparc/kernel/pci_sun4v.c
@@ -580,7 +580,7 @@ static int __devinit pci_sun4v_iommu_init(struct 
pci_pbm_info *pbm)
 {
        static const u32 vdma_default[] = { 0x80000000, 0x80000000 };
        struct iommu *iommu = pbm->iommu;
-       unsigned long num_tsb_entries, sz, tsbsize;
+       unsigned long num_tsb_entries, sz;
        u32 dma_mask, dma_offset;
        const u32 *vdma;
 
@@ -596,7 +596,6 @@ static int __devinit pci_sun4v_iommu_init(struct 
pci_pbm_info *pbm)
 
        dma_mask = (roundup_pow_of_two(vdma[1]) - 1UL);
        num_tsb_entries = vdma[1] / IO_PAGE_SIZE;
-       tsbsize = num_tsb_entries * sizeof(iopte_t);
 
        dma_offset = vdma[0];
 
diff --git a/arch/sparc/kernel/pcr.c b/arch/sparc/kernel/pcr.c
index 7c2ced6..8ac23e6 100644
--- a/arch/sparc/kernel/pcr.c
+++ b/arch/sparc/kernel/pcr.c
@@ -81,7 +81,7 @@ static void n2_pcr_write(u64 val)
        unsigned long ret;
 
        ret = sun4v_niagara2_setperf(HV_N2_PERF_SPARC_CTL, val);
-       if (val != HV_EOK)
+       if (ret != HV_EOK)
                write_pcr(val);
 }
 
diff --git a/arch/sparc/kernel/ptrace_64.c b/arch/sparc/kernel/ptrace_64.c
index 9ccc812..96ee50a 100644
--- a/arch/sparc/kernel/ptrace_64.c
+++ b/arch/sparc/kernel/ptrace_64.c
@@ -1086,6 +1086,7 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs)
 
 asmlinkage void syscall_trace_leave(struct pt_regs *regs)
 {
+#ifdef CONFIG_AUDITSYSCALL
        if (unlikely(current->audit_context)) {
                unsigned long tstate = regs->tstate;
                int result = AUDITSC_SUCCESS;
@@ -1095,7 +1096,7 @@ asmlinkage void syscall_trace_leave(struct pt_regs *regs)
 
                audit_syscall_exit(result, regs->u_regs[UREG_I0]);
        }
-
+#endif
        if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
                trace_sys_exit(regs, regs->u_regs[UREG_G1]);
 
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c
index 555a76d..3e94a8c 100644
--- a/arch/sparc/kernel/smp_64.c
+++ b/arch/sparc/kernel/smp_64.c
@@ -189,7 +189,7 @@ static inline long get_delta (long *rt, long *master)
 void smp_synchronize_tick_client(void)
 {
        long i, delta, adj, adjust_latency = 0, done = 0;
-       unsigned long flags, rt, master_time_stamp, bound;
+       unsigned long flags, rt, master_time_stamp;
 #if DEBUG_TICK_SYNC
        struct {
                long rt;        /* roundtrip time */
@@ -208,10 +208,8 @@ void smp_synchronize_tick_client(void)
        {
                for (i = 0; i < NUM_ROUNDS; i++) {
                        delta = get_delta(&rt, &master_time_stamp);
-                       if (delta == 0) {
+                       if (delta == 0)
                                done = 1;       /* let's lock on to this... */
-                               bound = rt;
-                       }
 
                        if (!done) {
                                if (i > 0) {
@@ -933,13 +931,12 @@ void smp_flush_dcache_page_impl(struct page *page, int 
cpu)
 void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
 {
        void *pg_addr;
-       int this_cpu;
        u64 data0;
 
        if (tlb_type == hypervisor)
                return;
 
-       this_cpu = get_cpu();
+       preempt_disable();
 
 #ifdef CONFIG_DEBUG_DCFLUSH
        atomic_inc(&dcpage_flushes);
@@ -964,7 +961,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct 
page *page)
        }
        __local_flush_dcache_page(page);
 
-       put_cpu();
+       preempt_enable();
 }
 
 void __irq_entry smp_new_mmu_context_version_client(int irq, struct pt_regs 
*regs)
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c
index 1e97709..1ed547b 100644
--- a/arch/sparc/kernel/traps_64.c
+++ b/arch/sparc/kernel/traps_64.c
@@ -2152,7 +2152,7 @@ static void user_instruction_dump(unsigned int __user *pc)
 
 void show_stack(struct task_struct *tsk, unsigned long *_ksp)
 {
-       unsigned long fp, thread_base, ksp;
+       unsigned long fp, ksp;
        struct thread_info *tp;
        int count = 0;
 #ifdef CONFIG_FUNCTION_GRAPH_TRACER
@@ -2173,7 +2173,6 @@ void show_stack(struct task_struct *tsk, unsigned long 
*_ksp)
                flushw_all();
 
        fp = ksp + STACK_BIAS;
-       thread_base = (unsigned long) tp;
 
        printk("Call Trace:\n");
        do {
-- 
1.7.4.3

_______________________________________________
stable mailing list
[email protected]
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to