2009-06-27 14:08:30

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH 0/6] score cleanups

Hi Liqin,

I've gone over your code a bit with sparse and some clues,
cleaning up some areas that stuck out.

Please check that these make sense.

Arnd <><

Arnd Bergmann (6):
score: add missing #includes
score: add address space annotations
score: fix function prototypes
score: cleanups: dead code, 0 as pointer, shadowed variables
score: make irq.h definitions local
score: clean up mm/init.c

arch/score/include/asm/irq.h | 10 ---------
arch/score/include/asm/uaccess.h | 4 +-
arch/score/include/asm/ucontext.h | 1 +
arch/score/kernel/irq.c | 33 ++++++++++++++++++++++---------
arch/score/kernel/module.c | 13 ++++++-----
arch/score/kernel/process.c | 3 ++
arch/score/kernel/ptrace.c | 7 +++--
arch/score/kernel/signal.c | 38 +++++++++++++++++++++---------------
arch/score/kernel/sys_score.c | 28 +++++++++-----------------
arch/score/kernel/time.c | 2 +-
arch/score/mm/init.c | 34 +++++++++-----------------------
11 files changed, 83 insertions(+), 90 deletions(-)
create mode 100644 arch/score/include/asm/ucontext.h


2009-06-27 14:08:43

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH 3/6] score: fix function prototypes

Syscalls should return 'long' and be marked as 'asmlinkage'.
Functions that are only used in a single file should be 'static'.

Signed-off-by: Arnd Bergmann <[email protected]>
---
arch/score/kernel/signal.c | 22 +++++++++++++---------
arch/score/kernel/sys_score.c | 5 +++--
arch/score/kernel/time.c | 2 +-
3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c
index 1634aaa..afbfe33 100644
--- a/arch/score/kernel/signal.c
+++ b/arch/score/kernel/signal.c
@@ -42,7 +42,7 @@ struct rt_sigframe {
struct ucontext rs_uc;
};

-int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
+static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
{
int err = 0;
unsigned long reg;
@@ -76,7 +76,7 @@ int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
return err;
}

-int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
+static int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
{
int err = 0;
u32 reg;
@@ -118,8 +118,8 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
/*
* Determine which stack to use..
*/
-void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
- size_t frame_size)
+static void __user *get_sigframe(struct k_sigaction *ka,
+ struct pt_regs *regs, size_t frame_size)
{
unsigned long sp;

@@ -134,7 +134,8 @@ void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
return (void __user*)((sp - frame_size) & ~7);
}

-int score_sigaltstack(struct pt_regs *regs)
+asmlinkage long
+score_sigaltstack(struct pt_regs *regs)
{
const stack_t __user *uss = (const stack_t __user *) regs->regs[4];
stack_t __user *uoss = (stack_t __user *) regs->regs[5];
@@ -143,7 +144,8 @@ int score_sigaltstack(struct pt_regs *regs)
return do_sigaltstack(uss, uoss, usp);
}

-void score_rt_sigreturn(struct pt_regs *regs)
+asmlinkage long
+score_rt_sigreturn(struct pt_regs *regs)
{
struct rt_sigframe __user *frame;
sigset_t set;
@@ -183,9 +185,11 @@ void score_rt_sigreturn(struct pt_regs *regs)

badframe:
force_sig(SIGSEGV, current);
+
+ return 0;
}

-int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
+static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
int signr, sigset_t *set, siginfo_t *info)
{
struct rt_sigframe __user *frame;
@@ -238,7 +242,7 @@ give_sigsegv:
return -EFAULT;
}

-int handle_signal(unsigned long sig, siginfo_t *info,
+static int handle_signal(unsigned long sig, siginfo_t *info,
struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs)
{
int ret;
@@ -278,7 +282,7 @@ int handle_signal(unsigned long sig, siginfo_t *info,
return ret;
}

-void do_signal(struct pt_regs *regs)
+static void do_signal(struct pt_regs *regs)
{
struct k_sigaction ka;
sigset_t *oldset;
diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c
index 16ace29..5b3cc4e 100644
--- a/arch/score/kernel/sys_score.c
+++ b/arch/score/kernel/sys_score.c
@@ -34,7 +34,7 @@
unsigned long shm_align_mask = PAGE_SIZE - 1;
EXPORT_SYMBOL(shm_align_mask);

-asmlinkage unsigned long
+asmlinkage unsigned
sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
unsigned long flags, unsigned long fd, unsigned long pgoff)
{
@@ -66,7 +66,8 @@ sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
* Clone a task - this clones the calling program thread.
* This is called indirectly via a small wrapper
*/
-int score_clone(struct pt_regs *regs)
+asmlinkage long
+score_clone(struct pt_regs *regs)
{
unsigned long clone_flags;
unsigned long newsp;
diff --git a/arch/score/kernel/time.c b/arch/score/kernel/time.c
index cd66ba3..f0a43af 100644
--- a/arch/score/kernel/time.c
+++ b/arch/score/kernel/time.c
@@ -28,7 +28,7 @@

#include <asm/scoreregs.h>

-irqreturn_t timer_interrupt(int irq, void *dev_id)
+static irqreturn_t timer_interrupt(int irq, void *dev_id)
{
struct clock_event_device *evdev = dev_id;

--
1.6.3.1

2009-06-27 14:08:56

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH 2/6] score: add address space annotations

Annotate the address space for pointers that are used
correctly with __user and __iomem, so that sparse
can better warn about incorrect casts.

Signed-off-by: Arnd Bergmann <[email protected]>
---
arch/score/include/asm/uaccess.h | 4 ++--
arch/score/kernel/ptrace.c | 7 ++++---
arch/score/kernel/signal.c | 10 +++++-----
arch/score/kernel/sys_score.c | 9 +++++----
4 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/arch/score/include/asm/uaccess.h b/arch/score/include/asm/uaccess.h
index 43ce28a..6f09e2b 100644
--- a/arch/score/include/asm/uaccess.h
+++ b/arch/score/include/asm/uaccess.h
@@ -13,9 +13,9 @@ extern int fixup_exception(struct pt_regs *regs);
#ifndef __ASSEMBLY__

#define __range_ok(addr, size) \
- ((((unsigned long)(addr) >= 0x80000000) \
+ ((((unsigned long __force)(addr) >= 0x80000000) \
|| ((unsigned long)(size) > 0x80000000) \
- || (((unsigned long)(addr) + (unsigned long)(size)) > 0x80000000)))
+ || (((unsigned long __force)(addr) + (unsigned long)(size)) > 0x80000000)))

#define __access_ok(addr, size) \
(__range_ok((addr), (size)) == 0)
diff --git a/arch/score/kernel/ptrace.c b/arch/score/kernel/ptrace.c
index 19911e3..1db876b 100644
--- a/arch/score/kernel/ptrace.c
+++ b/arch/score/kernel/ptrace.c
@@ -267,6 +267,7 @@ long
arch_ptrace(struct task_struct *child, long request, long addr, long data)
{
int ret;
+ unsigned long __user *datap = (void __user *)data;

switch (request) {
/* Read the word at location addr in the USER area. */
@@ -316,7 +317,7 @@ arch_ptrace(struct task_struct *child, long request, long addr, long data)
return -EIO;
}

- ret = put_user(tmp, (unsigned long *) data);
+ ret = put_user(tmp, (unsigned int __user *) datap);
return ret;
}

@@ -355,11 +356,11 @@ arch_ptrace(struct task_struct *child, long request, long addr, long data)
}

case PTRACE_GETREGS:
- ret = ptrace_getregs(child, (void __user *)data);
+ ret = ptrace_getregs(child, (void __user *)datap);
break;

case PTRACE_SETREGS:
- ret = ptrace_setregs(child, (void __user *)data);
+ ret = ptrace_setregs(child, (void __user *)datap);
break;

default:
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c
index 252f6d9..1634aaa 100644
--- a/arch/score/kernel/signal.c
+++ b/arch/score/kernel/signal.c
@@ -131,13 +131,13 @@ void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
if ((ka->sa.sa_flags & SA_ONSTACK) && (!on_sig_stack(sp)))
sp = current->sas_ss_sp + current->sas_ss_size;

- return (void *)((sp - frame_size) & ~7);
+ return (void __user*)((sp - frame_size) & ~7);
}

int score_sigaltstack(struct pt_regs *regs)
{
- const stack_t *uss = (const stack_t *) regs->regs[4];
- stack_t *uoss = (stack_t *) regs->regs[5];
+ const stack_t __user *uss = (const stack_t __user *) regs->regs[4];
+ stack_t __user *uoss = (stack_t __user *) regs->regs[5];
unsigned long usp = regs->regs[0];

return do_sigaltstack(uss, uoss, usp);
@@ -188,7 +188,7 @@ badframe:
int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
int signr, sigset_t *set, siginfo_t *info)
{
- struct rt_sigframe *frame;
+ struct rt_sigframe __user *frame;
int err = 0;

frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -209,7 +209,7 @@ int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
err |= copy_siginfo_to_user(&frame->rs_info, info);
err |= __put_user(0, &frame->rs_uc.uc_flags);
err |= __put_user(0, &frame->rs_uc.uc_link);
- err |= __put_user((void *)current->sas_ss_sp,
+ err |= __put_user((void __user *)current->sas_ss_sp,
&frame->rs_uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->regs[0]),
&frame->rs_uc.uc_stack.ss_flags);
diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c
index eb4d2d3..16ace29 100644
--- a/arch/score/kernel/sys_score.c
+++ b/arch/score/kernel/sys_score.c
@@ -87,18 +87,19 @@ int score_clone(struct pt_regs *regs)
* sys_execve() executes a new program.
* This is called indirectly via a small wrapper
*/
-int score_execve(struct pt_regs *regs)
+asmlinkage long
+score_execve(struct pt_regs *regs)
{
int error;
char *filename;

- filename = getname((char *) (long) regs->regs[4]);
+ filename = getname((char __user*)regs->regs[4]);
error = PTR_ERR(filename);
if (IS_ERR(filename))
return error;

- error = do_execve(filename, (char **) (long) regs->regs[5],
- (char **) (long) regs->regs[6], regs);
+ error = do_execve(filename, (char __user *__user*)regs->regs[5],
+ (char __user *__user *) regs->regs[6], regs);

putname(filename);
return error;
--
1.6.3.1

2009-06-27 14:09:15

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH 1/6] score: add missing #includes

Files that define a global function should #include the
header with its declaration to make sure that the prototypes
do not diverge.

Signed-off-by: Arnd Bergmann <[email protected]>
---
arch/score/include/asm/ucontext.h | 1 +
arch/score/kernel/module.c | 1 +
arch/score/kernel/process.c | 3 +++
arch/score/kernel/signal.c | 4 +++-
arch/score/kernel/sys_score.c | 2 ++
5 files changed, 10 insertions(+), 1 deletions(-)
create mode 100644 arch/score/include/asm/ucontext.h

diff --git a/arch/score/include/asm/ucontext.h b/arch/score/include/asm/ucontext.h
new file mode 100644
index 0000000..9bc07b9
--- /dev/null
+++ b/arch/score/include/asm/ucontext.h
@@ -0,0 +1 @@
+#include <asm-generic/ucontext.h>
diff --git a/arch/score/kernel/module.c b/arch/score/kernel/module.c
index 4ffce7f..1a62557 100644
--- a/arch/score/kernel/module.c
+++ b/arch/score/kernel/module.c
@@ -23,6 +23,7 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

+#include <linux/moduleloader.h>
#include <linux/module.h>
#include <linux/vmalloc.h>

diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c
index d93966f..25d0803 100644
--- a/arch/score/kernel/process.c
+++ b/arch/score/kernel/process.c
@@ -24,6 +24,9 @@
*/

#include <linux/module.h>
+#include <linux/reboot.h>
+#include <linux/elfcore.h>
+#include <linux/pm.h>

void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c
index 5c00408..252f6d9 100644
--- a/arch/score/kernel/signal.c
+++ b/arch/score/kernel/signal.c
@@ -27,7 +27,9 @@
#include <linux/signal.h>
#include <linux/unistd.h>
#include <linux/uaccess.h>
-#include <asm-generic/ucontext.h>
+
+#include <asm/syscalls.h>
+#include <asm/ucontext.h>

#include <asm/cacheflush.h>

diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c
index 3318861..eb4d2d3 100644
--- a/arch/score/kernel/sys_score.c
+++ b/arch/score/kernel/sys_score.c
@@ -28,6 +28,8 @@
#include <linux/mman.h>
#include <linux/module.h>
#include <linux/unistd.h>
+#include <linux/syscalls.h>
+#include <asm/syscalls.h>

unsigned long shm_align_mask = PAGE_SIZE - 1;
EXPORT_SYMBOL(shm_align_mask);
--
1.6.3.1

2009-06-27 14:09:30

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH 6/6] score: clean up mm/init.c

score does not need multiple zero pages, because it does not
suffer from cache aliasing problems, so simplify that code.
Also make some functions static and include the appropriate
header files.

Signed-off-by: Arnd Bergmann <[email protected]>
---
arch/score/mm/init.c | 34 ++++++++++------------------------
1 files changed, 10 insertions(+), 24 deletions(-)

diff --git a/arch/score/mm/init.c b/arch/score/mm/init.c
index 7780eec..d496e9f 100644
--- a/arch/score/mm/init.c
+++ b/arch/score/mm/init.c
@@ -32,44 +32,30 @@
#include <linux/pagemap.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
-#include <asm-generic/sections.h>
+#include <linux/initrd.h>

+#include <asm/sections.h>
#include <asm/tlb.h>

DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);

-/*
- * We have up to 8 empty zeroed pages so we can map one of the right colour
- * when needed.
- */
-unsigned long zero_page_mask;
unsigned long empty_zero_page;
EXPORT_SYMBOL_GPL(empty_zero_page);

static struct kcore_list kcore_mem, kcore_vmalloc;

-unsigned long setup_zero_pages(void)
+static unsigned long setup_zero_page(void)
{
- unsigned int order = 0;
- unsigned long size;
struct page *page;

- empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, order);
+ empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, 0);
if (!empty_zero_page)
panic("Oh boy, that early out of memory?");

page = virt_to_page((void *) empty_zero_page);
- split_page(page, order);
- while (page < virt_to_page((void *) (empty_zero_page +
- (PAGE_SIZE << order)))) {
- SetPageReserved(page);
- page++;
- }
-
- size = PAGE_SIZE << order;
- zero_page_mask = (size - 1) & PAGE_MASK;
+ SetPageReserved(page);

- return 1UL << order;
+ return 1UL;
}

#ifndef CONFIG_NEED_MULTIPLE_NODES
@@ -100,7 +86,7 @@ void __init mem_init(void)
max_mapnr = max_low_pfn;
high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);
totalram_pages += free_all_bootmem();
- totalram_pages -= setup_zero_pages(); /* Setup zeroed pages. */
+ totalram_pages -= setup_zero_page(); /* Setup zeroed pages. */
reservedpages = 0;

for (tmp = 0; tmp < max_low_pfn; tmp++)
@@ -129,7 +115,7 @@ void __init mem_init(void)
}
#endif /* !CONFIG_NEED_MULTIPLE_NODES */

-void free_init_pages(const char *what, unsigned long begin, unsigned long end)
+static void free_init_pages(const char *what, unsigned long begin, unsigned long end)
{
unsigned long pfn;

@@ -150,8 +136,8 @@ void free_init_pages(const char *what, unsigned long begin, unsigned long end)
void free_initrd_mem(unsigned long start, unsigned long end)
{
free_init_pages("initrd memory",
- virt_to_phys((void *) start),
- virt_to_phys((void *) end));
+ virt_to_phys((void *) start),
+ virt_to_phys((void *) end));
}
#endif

--
1.6.3.1

2009-06-27 14:09:42

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH 5/6] score: make irq.h definitions local

Some internal definitions of the interrupt controller are
only needed in irq.c, so move them out of the global irq.h
header. Also add proper __iomem annotations for sparse.

Signed-off-by: Arnd Bergmann <[email protected]>
---
arch/score/include/asm/irq.h | 10 ----------
arch/score/kernel/irq.c | 33 +++++++++++++++++++++++----------
2 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/arch/score/include/asm/irq.h b/arch/score/include/asm/irq.h
index 401f670..6edd2a2 100644
--- a/arch/score/include/asm/irq.h
+++ b/arch/score/include/asm/irq.h
@@ -18,16 +18,6 @@

#define irq_canonicalize(irq) (irq)

-#define P_INT_PNDL 0x95F50000
-#define P_INT_PNDH 0x95F50004
-#define P_INT_PRIORITY_M 0x95F50008
-#define P_INT_PRIORITY_SG0 0x95F50010
-#define P_INT_PRIORITY_SG1 0x95F50014
-#define P_INT_PRIORITY_SG2 0x95F50018
-#define P_INT_PRIORITY_SG3 0x95F5001C
-#define P_INT_MASKL 0x95F50020
-#define P_INT_MASKH 0x95F50024
-
#define IRQ_TIMER (7) /* Timer IRQ number of SPCT6600 */

#endif /* _ASM_SCORE_IRQ_H */
diff --git a/arch/score/kernel/irq.c b/arch/score/kernel/irq.c
index 55474e8..47647dd 100644
--- a/arch/score/kernel/irq.c
+++ b/arch/score/kernel/irq.c
@@ -29,6 +29,19 @@

#include <asm/io.h>

+/* the interrupt controller is hardcoded at this address */
+#define SCORE_PIC ((u32 __iomem __force *)0x95F50000)
+
+#define INT_PNDL 0
+#define INT_PNDH 1
+#define INT_PRIORITY_M 2
+#define INT_PRIORITY_SG0 4
+#define INT_PRIORITY_SG1 5
+#define INT_PRIORITY_SG2 6
+#define INT_PRIORITY_SG3 7
+#define INT_MASKL 8
+#define INT_MASKH 9
+
/*
* handles all normal device IRQs
*/
@@ -44,11 +57,11 @@ static void score_mask(unsigned int irq_nr)
unsigned int irq_source = 63 - irq_nr;

if (irq_source < 32)
- __raw_writel((__raw_readl((void *)P_INT_MASKL) | \
- (1 << irq_source)), (void *)P_INT_MASKL);
+ __raw_writel((__raw_readl(SCORE_PIC + INT_MASKL) | \
+ (1 << irq_source)), SCORE_PIC + INT_MASKL);
else
- __raw_writel((__raw_readl((void *)P_INT_MASKH) | \
- (1 << (irq_source - 32))), (void *)P_INT_MASKH);
+ __raw_writel((__raw_readl(SCORE_PIC + INT_MASKH) | \
+ (1 << (irq_source - 32))), SCORE_PIC + INT_MASKH);
}

static void score_unmask(unsigned int irq_nr)
@@ -56,11 +69,11 @@ static void score_unmask(unsigned int irq_nr)
unsigned int irq_source = 63 - irq_nr;

if (irq_source < 32)
- __raw_writel((__raw_readl((void *)P_INT_MASKL) & \
- ~(1 << irq_source)), (void *)P_INT_MASKL);
+ __raw_writel((__raw_readl(SCORE_PIC + INT_MASKL) & \
+ ~(1 << irq_source)), SCORE_PIC + INT_MASKL);
else
- __raw_writel((__raw_readl((void *)P_INT_MASKH) & \
- ~(1 << (irq_source - 32))), (void *)P_INT_MASKH);
+ __raw_writel((__raw_readl(SCORE_PIC + INT_MASKH) & \
+ ~(1 << (irq_source - 32))), SCORE_PIC + INT_MASKH);
}

struct irq_chip score_irq_chip = {
@@ -88,8 +101,8 @@ void __init init_IRQ(void)
memcpy((void *)target_addr, \
interrupt_exception_vector, IRQ_VECTOR_SIZE);

- __raw_writel(0xffffffff, (void *)P_INT_MASKL);
- __raw_writel(0xffffffff, (void *)P_INT_MASKH);
+ __raw_writel(0xffffffff, SCORE_PIC + INT_MASKL);
+ __raw_writel(0xffffffff, SCORE_PIC + INT_MASKH);

__asm__ __volatile__(
"mtcr %0, cr3\n\t"
--
1.6.3.1

2009-06-27 14:09:53

by Arnd Bergmann

[permalink] [raw]
Subject: [PATCH 4/6] score: cleanups: dead code, 0 as pointer, shadowed variables

A few smaller issues found by sparse, some code that was
never used, two instances of '0' instead of 'NULL' and
local variables shadowing another one.

Signed-off-by: Arnd Bergmann <[email protected]>
---
arch/score/kernel/module.c | 12 ++++++------
arch/score/kernel/signal.c | 2 +-
arch/score/kernel/sys_score.c | 14 +-------------
3 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/arch/score/kernel/module.c b/arch/score/kernel/module.c
index 1a62557..4de8d47 100644
--- a/arch/score/kernel/module.c
+++ b/arch/score/kernel/module.c
@@ -57,17 +57,17 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab,
for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) {
unsigned long loc;
Elf32_Sym *sym;
- s32 offset;
+ s32 r_offset;

- offset = ELF32_R_SYM(rel->r_info);
- if ((offset < 0) ||
- (offset > (symsec->sh_size / sizeof(Elf32_Sym)))) {
+ r_offset = ELF32_R_SYM(rel->r_info);
+ if ((r_offset < 0) ||
+ (r_offset > (symsec->sh_size / sizeof(Elf32_Sym)))) {
printk(KERN_ERR "%s: bad relocation, section %d reloc %d\n",
me->name, relindex, i);
return -ENOEXEC;
}

- sym = ((Elf32_Sym *)symsec->sh_addr) + offset;
+ sym = ((Elf32_Sym *)symsec->sh_addr) + r_offset;

if ((rel->r_offset < 0) ||
(rel->r_offset > dstsec->sh_size - sizeof(u32))) {
@@ -152,7 +152,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
/* Given an address, look for it in the module exception tables. */
const struct exception_table_entry *search_module_dbetables(unsigned long addr)
{
- return 0;
+ return NULL;
}

/* Put in dbe list if necessary. */
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c
index afbfe33..950f87c 100644
--- a/arch/score/kernel/signal.c
+++ b/arch/score/kernel/signal.c
@@ -212,7 +212,7 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,

err |= copy_siginfo_to_user(&frame->rs_info, info);
err |= __put_user(0, &frame->rs_uc.uc_flags);
- err |= __put_user(0, &frame->rs_uc.uc_link);
+ err |= __put_user(NULL, &frame->rs_uc.uc_link);
err |= __put_user((void __user *)current->sas_ss_sp,
&frame->rs_uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->regs[0]),
diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c
index 5b3cc4e..61aff8a 100644
--- a/arch/score/kernel/sys_score.c
+++ b/arch/score/kernel/sys_score.c
@@ -31,10 +31,7 @@
#include <linux/syscalls.h>
#include <asm/syscalls.h>

-unsigned long shm_align_mask = PAGE_SIZE - 1;
-EXPORT_SYMBOL(shm_align_mask);
-
-asmlinkage unsigned
+asmlinkage long
sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
unsigned long flags, unsigned long fd, unsigned long pgoff)
{
@@ -107,15 +104,6 @@ score_execve(struct pt_regs *regs)
}

/*
- * If we ever come here the user sp is bad. Zap the process right away.
- * Due to the bad stack signaling wouldn't work.
- */
-void bad_stack(void)
-{
- do_exit(SIGSEGV);
-}
-
-/*
* Do a system call from kernel instead of calling sys_execve so we
* end up with proper pt_regs.
*/
--
1.6.3.1

2009-06-29 11:24:56

by Chen Liqin

[permalink] [raw]
Subject: Re: [PATCH 0/6] score cleanups

Arnd Bergmann <[email protected]> д?? 2009-06-27 22:08:12:

> Hi Liqin,
>
> I've gone over your code a bit with sparse and some clues,
> cleaning up some areas that stuck out.
>
> Please check that these make sense.

Hi Arnd,

Code updating had finished and verified.

Best Regards
Liqin
---

From 05e9377257fcb80de597409989ef2cb715e3827c Mon Sep 17 00:00:00 2001
From: Chen Liqin <[email protected]>
Date: Mon, 29 Jun 2009 19:01:44 +0800
Subject: [PATCH] score: code cleanups

score: add missing #includes
score: add address space annotations
score: fix function prototypes
score: cleanups: dead code, 0 as pointer, shadowed variables
score: make irq.h definitions local

modified: arch/score/include/asm/irq.h
modified: arch/score/include/asm/uaccess.h
new file: arch/score/include/asm/ucontext.h
modified: arch/score/kernel/irq.c
modified: arch/score/kernel/module.c
modified: arch/score/kernel/process.c
modified: arch/score/kernel/ptrace.c
modified: arch/score/kernel/signal.c
modified: arch/score/kernel/sys_score.c
modified: arch/score/kernel/time.c
modified: arch/score/mm/init.c

Signed-off-by: Chen Liqin <[email protected]>
Signed-off-by: Arnd Bergmann <[email protected]>
---
arch/score/include/asm/irq.h | 19 +++++++++--------
arch/score/include/asm/uaccess.h | 8 +++---
arch/score/include/asm/ucontext.h | 6 +++++
arch/score/kernel/irq.c | 20 +++++++++---------
arch/score/kernel/module.c | 13 ++++++-----
arch/score/kernel/process.c | 3 ++
arch/score/kernel/ptrace.c | 7 +++--
arch/score/kernel/signal.c | 39
++++++++++++++++++++----------------
arch/score/kernel/sys_score.c | 26 ++++++++----------------
arch/score/kernel/time.c | 2 +-
arch/score/mm/init.c | 35 ++++++++++----------------------
11 files changed, 87 insertions(+), 91 deletions(-)
create mode 100644 arch/score/include/asm/ucontext.h

diff --git a/arch/score/include/asm/irq.h b/arch/score/include/asm/irq.h
index 401f670..806aaf2 100644
--- a/arch/score/include/asm/irq.h
+++ b/arch/score/include/asm/irq.h
@@ -18,15 +18,16 @@

#define irq_canonicalize(irq) (irq)

-#define P_INT_PNDL 0x95F50000
-#define P_INT_PNDH 0x95F50004
-#define P_INT_PRIORITY_M 0x95F50008
-#define P_INT_PRIORITY_SG0 0x95F50010
-#define P_INT_PRIORITY_SG1 0x95F50014
-#define P_INT_PRIORITY_SG2 0x95F50018
-#define P_INT_PRIORITY_SG3 0x95F5001C
-#define P_INT_MASKL 0x95F50020
-#define P_INT_MASKH 0x95F50024
+#define INTC_BASE ((u32 __iomem __force *)0x95f50000)
+#define INT_PNDL 0 /* 0x9f5c0000 */
+#define INT_PNDH 1 /* 0x9f5c0004 */
+#define INT_PRIORITY_M 2 /* 0x9f5c0008 */
+#define INT_PRIORITY_SG0 4 /* 0x9f5c0010 */
+#define INT_PRIORITY_SG1 5 /* 0x9f5c0014 */
+#define INT_PRIORITY_SG2 6 /* 0x9f5c0018 */
+#define INT_PRIORITY_SG3 7 /* 0x9f5c001C */
+#define INT_MASKL 8 /* 0x9f5c0020 */
+#define INT_MASKH 9 /* 0x9f5c0024 */

#define IRQ_TIMER (7) /* Timer IRQ number of SPCT6600 */

diff --git a/arch/score/include/asm/uaccess.h
b/arch/score/include/asm/uaccess.h
index 43ce28a..98fdb6f 100644
--- a/arch/score/include/asm/uaccess.h
+++ b/arch/score/include/asm/uaccess.h
@@ -13,12 +13,12 @@ extern int fixup_exception(struct pt_regs *regs);
#ifndef __ASSEMBLY__

#define __range_ok(addr, size) \
- ((((unsigned long)(addr) >= 0x80000000) \
+ ((((unsigned long __force)(addr) >= 0x80000000) \
|| ((unsigned long)(size) > 0x80000000) \
- || (((unsigned long)(addr) + (unsigned long)(size)) >
0x80000000)))
+ || (((unsigned long __force)(addr) + (unsigned long)(size)) \
+ > 0x80000000)))

-#define __access_ok(addr, size) \
- (__range_ok((addr), (size)) == 0)
+#define __access_ok(addr, size) (__range_ok((addr),
(size)) == 0)

#include <asm-generic/uaccess.h>

diff --git a/arch/score/include/asm/ucontext.h
b/arch/score/include/asm/ucontext.h
new file mode 100644
index 0000000..9c5fe5b
--- /dev/null
+++ b/arch/score/include/asm/ucontext.h
@@ -0,0 +1,6 @@
+#ifndef _ASM_SCORE_UCONTEXT_H
+#define _ASM_SCORE_UCONTEXT_H
+
+#include <asm-generic/ucontext.h>
+
+#endif /* _ASM_SCORE_UCONTEXT_H */
diff --git a/arch/score/kernel/irq.c b/arch/score/kernel/irq.c
index 55474e8..3a7f155 100644
--- a/arch/score/kernel/irq.c
+++ b/arch/score/kernel/irq.c
@@ -44,11 +44,11 @@ static void score_mask(unsigned int irq_nr)
unsigned int irq_source = 63 - irq_nr;

if (irq_source < 32)
- __raw_writel((__raw_readl((void *)P_INT_MASKL) | \
- (1 << irq_source)), (void *)P_INT_MASKL);
+ __raw_writel((__raw_readl(INTC_BASE + INT_MASKL) | \
+ (1 << irq_source)), INTC_BASE + INT_MASKL);
else
- __raw_writel((__raw_readl((void *)P_INT_MASKH) | \
- (1 << (irq_source - 32))), (void *)P_INT_MASKH);
+ __raw_writel((__raw_readl(INTC_BASE + INT_MASKH) | \
+ (1 << (irq_source - 32))), INTC_BASE + INT_MASKH);
}

static void score_unmask(unsigned int irq_nr)
@@ -56,11 +56,11 @@ static void score_unmask(unsigned int irq_nr)
unsigned int irq_source = 63 - irq_nr;

if (irq_source < 32)
- __raw_writel((__raw_readl((void *)P_INT_MASKL) & \
- ~(1 << irq_source)), (void *)P_INT_MASKL);
+ __raw_writel((__raw_readl(INTC_BASE + INT_MASKL) & \
+ ~(1 << irq_source)), INTC_BASE + INT_MASKL);
else
- __raw_writel((__raw_readl((void *)P_INT_MASKH) & \
- ~(1 << (irq_source - 32))), (void *)P_INT_MASKH);
+ __raw_writel((__raw_readl(INTC_BASE + INT_MASKH) & \
+ ~(1 << (irq_source - 32))), INTC_BASE +
INT_MASKH);
}

struct irq_chip score_irq_chip = {
@@ -88,8 +88,8 @@ void __init init_IRQ(void)
memcpy((void *)target_addr, \
interrupt_exception_vector, IRQ_VECTOR_SIZE);

- __raw_writel(0xffffffff, (void *)P_INT_MASKL);
- __raw_writel(0xffffffff, (void *)P_INT_MASKH);
+ __raw_writel(0xffffffff, INTC_BASE + INT_MASKL);
+ __raw_writel(0xffffffff, INTC_BASE + INT_MASKH);

__asm__ __volatile__(
"mtcr %0, cr3\n\t"
diff --git a/arch/score/kernel/module.c b/arch/score/kernel/module.c
index 4ffce7f..4de8d47 100644
--- a/arch/score/kernel/module.c
+++ b/arch/score/kernel/module.c
@@ -23,6 +23,7 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

+#include <linux/moduleloader.h>
#include <linux/module.h>
#include <linux/vmalloc.h>

@@ -56,17 +57,17 @@ int apply_relocate(Elf_Shdr *sechdrs, const char
*strtab,
for (i = 0; i < relsec->sh_size / sizeof(Elf32_Rel); i++, rel++) {
unsigned long loc;
Elf32_Sym *sym;
- s32 offset;
+ s32 r_offset;

- offset = ELF32_R_SYM(rel->r_info);
- if ((offset < 0) ||
- (offset > (symsec->sh_size / sizeof(Elf32_Sym)))) {
+ r_offset = ELF32_R_SYM(rel->r_info);
+ if ((r_offset < 0) ||
+ (r_offset > (symsec->sh_size / sizeof(Elf32_Sym)))) {
printk(KERN_ERR "%s: bad relocation, section %d
reloc %d\n",
me->name, relindex, i);
return -ENOEXEC;
}

- sym = ((Elf32_Sym *)symsec->sh_addr) + offset;
+ sym = ((Elf32_Sym *)symsec->sh_addr) + r_offset;

if ((rel->r_offset < 0) ||
(rel->r_offset > dstsec->sh_size - sizeof(u32))) {
@@ -151,7 +152,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char
*strtab,
/* Given an address, look for it in the module exception tables. */
const struct exception_table_entry *search_module_dbetables(unsigned long
addr)
{
- return 0;
+ return NULL;
}

/* Put in dbe list if necessary. */
diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c
index d93966f..84575b2 100644
--- a/arch/score/kernel/process.c
+++ b/arch/score/kernel/process.c
@@ -23,7 +23,10 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/

+#include <linux/elfcore.h>
#include <linux/module.h>
+#include <linux/pm.h>
+#include <linux/reboot.h>

void (*pm_power_off)(void);
EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/score/kernel/ptrace.c b/arch/score/kernel/ptrace.c
index 19911e3..897dd7c 100644
--- a/arch/score/kernel/ptrace.c
+++ b/arch/score/kernel/ptrace.c
@@ -267,6 +267,7 @@ long
arch_ptrace(struct task_struct *child, long request, long addr, long
data)
{
int ret;
+ unsigned long __user *datap = (void __user *)data;

switch (request) {
/* Read the word at location addr in the USER area. */
@@ -316,7 +317,7 @@ arch_ptrace(struct task_struct *child, long request,
long addr, long data)
return -EIO;
}

- ret = put_user(tmp, (unsigned long *) data);
+ ret = put_user(tmp, (unsigned long *) datap);
return ret;
}

@@ -355,11 +356,11 @@ arch_ptrace(struct task_struct *child, long request,
long addr, long data)
}

case PTRACE_GETREGS:
- ret = ptrace_getregs(child, (void __user *)data);
+ ret = ptrace_getregs(child, (void __user *)datap);
break;

case PTRACE_SETREGS:
- ret = ptrace_setregs(child, (void __user *)data);
+ ret = ptrace_setregs(child, (void __user *)datap);
break;

default:
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c
index 5c00408..e351c02 100644
--- a/arch/score/kernel/signal.c
+++ b/arch/score/kernel/signal.c
@@ -27,7 +27,9 @@
#include <linux/signal.h>
#include <linux/unistd.h>
#include <linux/uaccess.h>
-#include <asm-generic/ucontext.h>
+
+#include <asm/syscalls.h>
+#include <asm/ucontext.h>

#include <asm/cacheflush.h>

@@ -40,7 +42,8 @@ struct rt_sigframe {
struct ucontext rs_uc;
};

-int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
+static int
+setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
{
int err = 0;
unsigned long reg;
@@ -74,7 +77,8 @@ int setup_sigcontext(struct pt_regs *regs, struct
sigcontext __user *sc)
return err;
}

-int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user
*sc)
+static int
+restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
{
int err = 0;
u32 reg;
@@ -116,8 +120,8 @@ int restore_sigcontext(struct pt_regs *regs, struct
sigcontext __user *sc)
/*
* Determine which stack to use..
*/
-void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
- size_t frame_size)
+static void __user *
+get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t
frame_size)
{
unsigned long sp;

@@ -129,19 +133,19 @@ void __user *get_sigframe(struct k_sigaction *ka,
struct pt_regs *regs,
if ((ka->sa.sa_flags & SA_ONSTACK) && (!on_sig_stack(sp)))
sp = current->sas_ss_sp + current->sas_ss_size;

- return (void *)((sp - frame_size) & ~7);
+ return (void __user *)((sp - frame_size) & ~7);
}

-int score_sigaltstack(struct pt_regs *regs)
+asmlinkage long score_sigaltstack(struct pt_regs *regs)
{
- const stack_t *uss = (const stack_t *) regs->regs[4];
- stack_t *uoss = (stack_t *) regs->regs[5];
+ const stack_t __user *uss = (const stack_t __user *)
regs->regs[4];
+ stack_t __user *uoss = (stack_t __user *) regs->regs[5];
unsigned long usp = regs->regs[0];

return do_sigaltstack(uss, uoss, usp);
}

-void score_rt_sigreturn(struct pt_regs *regs)
+asmlinkage long score_rt_sigreturn(struct pt_regs *regs)
{
struct rt_sigframe __user *frame;
sigset_t set;
@@ -181,12 +185,13 @@ void score_rt_sigreturn(struct pt_regs *regs)

badframe:
force_sig(SIGSEGV, current);
+ return 0;
}

-int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
- int signr, sigset_t *set, siginfo_t *info)
+static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
+ int signr, sigset_t *set, siginfo_t *info)
{
- struct rt_sigframe *frame;
+ struct rt_sigframe __user *frame;
int err = 0;

frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -206,8 +211,8 @@ int setup_rt_frame(struct k_sigaction *ka, struct
pt_regs *regs,

err |= copy_siginfo_to_user(&frame->rs_info, info);
err |= __put_user(0, &frame->rs_uc.uc_flags);
- err |= __put_user(0, &frame->rs_uc.uc_link);
- err |= __put_user((void *)current->sas_ss_sp,
+ err |= __put_user(NULL, &frame->rs_uc.uc_link);
+ err |= __put_user((void __user *)current->sas_ss_sp,
&frame->rs_uc.uc_stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->regs[0]),
&frame->rs_uc.uc_stack.ss_flags);
@@ -236,7 +241,7 @@ give_sigsegv:
return -EFAULT;
}

-int handle_signal(unsigned long sig, siginfo_t *info,
+static int handle_signal(unsigned long sig, siginfo_t *info,
struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs)
{
int ret;
@@ -276,7 +281,7 @@ int handle_signal(unsigned long sig, siginfo_t *info,
return ret;
}

-void do_signal(struct pt_regs *regs)
+static void do_signal(struct pt_regs *regs)
{
struct k_sigaction ka;
sigset_t *oldset;
diff --git a/arch/score/kernel/sys_score.c b/arch/score/kernel/sys_score.c
index 3318861..c5a3fbc 100644
--- a/arch/score/kernel/sys_score.c
+++ b/arch/score/kernel/sys_score.c
@@ -27,12 +27,12 @@
#include <linux/fs.h>
#include <linux/mman.h>
#include <linux/module.h>
+#include <linux/syscalls.h>
#include <linux/unistd.h>

-unsigned long shm_align_mask = PAGE_SIZE - 1;
-EXPORT_SYMBOL(shm_align_mask);
+#include <asm/syscalls.h>

-asmlinkage unsigned long
+asmlinkage long
sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
unsigned long flags, unsigned long fd, unsigned long pgoff)
{
@@ -64,7 +64,7 @@ sys_mmap2(unsigned long addr, unsigned long len,
unsigned long prot,
* Clone a task - this clones the calling program thread.
* This is called indirectly via a small wrapper
*/
-int score_clone(struct pt_regs *regs)
+asmlinkage long score_clone(struct pt_regs *regs)
{
unsigned long clone_flags;
unsigned long newsp;
@@ -85,33 +85,25 @@ int score_clone(struct pt_regs *regs)
* sys_execve() executes a new program.
* This is called indirectly via a small wrapper
*/
-int score_execve(struct pt_regs *regs)
+asmlinkage long score_execve(struct pt_regs *regs)
{
int error;
char *filename;

- filename = getname((char *) (long) regs->regs[4]);
+ filename = getname((char __user *)regs->regs[4]);
error = PTR_ERR(filename);
if (IS_ERR(filename))
return error;

- error = do_execve(filename, (char **) (long) regs->regs[5],
- (char **) (long) regs->regs[6], regs);
+ error = do_execve(filename,
+ (char __user * __user *)(long)regs->regs[5],
+ (char __user * __user *)(long)regs->regs[6],
regs);

putname(filename);
return error;
}

/*
- * If we ever come here the user sp is bad. Zap the process right away.
- * Due to the bad stack signaling wouldn't work.
- */
-void bad_stack(void)
-{
- do_exit(SIGSEGV);
-}
-
-/*
* Do a system call from kernel instead of calling sys_execve so we
* end up with proper pt_regs.
*/
diff --git a/arch/score/kernel/time.c b/arch/score/kernel/time.c
index cd66ba3..f0a43af 100644
--- a/arch/score/kernel/time.c
+++ b/arch/score/kernel/time.c
@@ -28,7 +28,7 @@

#include <asm/scoreregs.h>

-irqreturn_t timer_interrupt(int irq, void *dev_id)
+static irqreturn_t timer_interrupt(int irq, void *dev_id)
{
struct clock_event_device *evdev = dev_id;

diff --git a/arch/score/mm/init.c b/arch/score/mm/init.c
index 7780eec..e5f6f2e 100644
--- a/arch/score/mm/init.c
+++ b/arch/score/mm/init.c
@@ -32,44 +32,30 @@
#include <linux/pagemap.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
-#include <asm-generic/sections.h>
+#include <linux/initrd.h>

+#include <asm/sections.h>
#include <asm/tlb.h>

DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);

-/*
- * We have up to 8 empty zeroed pages so we can map one of the right
colour
- * when needed.
- */
-unsigned long zero_page_mask;
unsigned long empty_zero_page;
EXPORT_SYMBOL_GPL(empty_zero_page);

static struct kcore_list kcore_mem, kcore_vmalloc;

-unsigned long setup_zero_pages(void)
+static unsigned long setup_zero_page(void)
{
- unsigned int order = 0;
- unsigned long size;
struct page *page;

- empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO,
order);
+ empty_zero_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, 0);
if (!empty_zero_page)
panic("Oh boy, that early out of memory?");

page = virt_to_page((void *) empty_zero_page);
- split_page(page, order);
- while (page < virt_to_page((void *) (empty_zero_page +
- (PAGE_SIZE << order)))) {
- SetPageReserved(page);
- page++;
- }
-
- size = PAGE_SIZE << order;
- zero_page_mask = (size - 1) & PAGE_MASK;
+ SetPageReserved(page);

- return 1UL << order;
+ return 1UL;
}

#ifndef CONFIG_NEED_MULTIPLE_NODES
@@ -100,7 +86,7 @@ void __init mem_init(void)
max_mapnr = max_low_pfn;
high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);
totalram_pages += free_all_bootmem();
- totalram_pages -= setup_zero_pages(); /* Setup zeroed pages. */
+ totalram_pages -= setup_zero_page(); /* Setup zeroed pages. */
reservedpages = 0;

for (tmp = 0; tmp < max_low_pfn; tmp++)
@@ -129,7 +115,8 @@ void __init mem_init(void)
}
#endif /* !CONFIG_NEED_MULTIPLE_NODES */

-void free_init_pages(const char *what, unsigned long begin, unsigned long
end)
+static void
+free_init_pages(const char *what, unsigned long begin, unsigned long end)
{
unsigned long pfn;

@@ -150,8 +137,8 @@ void free_init_pages(const char *what, unsigned long
begin, unsigned long end)
void free_initrd_mem(unsigned long start, unsigned long end)
{
free_init_pages("initrd memory",
- virt_to_phys((void *) start),
- virt_to_phys((void *) end));
+ virt_to_phys((void *) start),
+ virt_to_phys((void *) end));
}
#endif

--
1.6.2




Attachments:
0001-score-code-cleanups.patch (16.61 kB)

2009-06-29 16:29:09

by Arnd Bergmann

[permalink] [raw]
Subject: Re: [PATCH 0/6] score cleanups

On Monday 29 June 2009, [email protected] wrote:
> Arnd Bergmann <[email protected]> 写于 2009-06-27 22:08:12:
>
> > Hi Liqin,
> >
> > I've gone over your code a bit with sparse and some clues,
> > cleaning up some areas that stuck out.
> >
> > Please check that these make sense.
>
> Hi Arnd,
>
> Code updating had finished and verified.

Ok, I've pushed out my original patches now. Unfortunately,
the way you sent back the patches was not helpful. Your mail
client still suffers from line-wrapping, which makes it impossible
to apply and you dropped all the changelog entries that I wrote.

It took me longer to split the changes into logical patches
with an appropriate changelog, so they really should not
be merged again. If you don't have a comment for the patches,
a better action would have been to reply with 'Acked-by:
Chen Liqin <[email protected]>'.

>
> Signed-off-by: Chen Liqin <[email protected]>
> Signed-off-by: Arnd Bergmann <[email protected]>

Here you mixed up the order of the 'Signed-off-by:'-lines.
If you forward a patch from someone else, you should always
put your own S-O-B after all the the others, not before them.
of(u32))) {

> @@ -151,7 +152,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char
> *strtab,
> /* Given an address, look for it in the module exception tables. */
> const struct exception_table_entry *search_module_dbetables(unsigned long
> addr)

This is one example of how the line wrapping broke the patch. It's basically
impossible to apply and test if the patch is broken like this.

Arnd <><