On Mon, 5 May 2008 00:08:04 +0200, tsbogend@xxxxxxxxxxxxxxxx (Thomas Bogendoerfer) wrote: > > while (!kstack_end((void *)(unsigned long)sp)) { > > > > will make this part sparse-free, though it seems a bit ugly. > > hmm, would leaving sp as unsigned long * and casting it for __get_user() > make sparse happy ? Well, not as expected... Here is some warning patterns. 1. unsigned long __user *sp = (unsigned long __user *)(reg29 & ~3); ... while (!kstack_end(sp)) { if (__get_user(addr, sp++)) { linux/arch/mips/kernel/traps.c:91:21: warning: incorrect type in argument 1 (different address spaces) linux/arch/mips/kernel/traps.c:91:21: expected void *addr linux/arch/mips/kernel/traps.c:91:21: got unsigned long [noderef] <asn:1>*sp 2. unsigned long *sp = (unsigned long *)(reg29 & ~3); ... while (!kstack_end(sp)) { if (__get_user(addr, (unsigned long __user *)sp++)) { linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) linux/arch/mips/kernel/traps.c:92:7: warning: cast adds address space to expression (<asn:1>) 3. unsigned long __user *sp = (unsigned long __user *)(reg29 & ~3); ... while (!kstack_end((void *)(unsigned long)sp)) { if (__get_user(addr, sp++)) { No warnings. 4. unsigned long *sp = (unsigned long *)(reg29 & ~3); ... while (!kstack_end(sp)) { unsigned long __user *p = (unsigned long __user *)sp++; if (__get_user(addr, p)) { linux/arch/mips/kernel/traps.c:92:30: warning: cast adds address space to expression (<asn:1>) 4. unsigned long *sp = (unsigned long *)(reg29 & ~3); ... while (!kstack_end(sp)) { unsigned long __user *p = (unsigned long __user *)(unsigned long)sp++; if (__get_user(addr, p)) { No warnings. I think the "cast adds address space to expression" sparse warning is not worth to handle so seriously. So I'm OK with any of (2) to (4). --- Atsushi Nemoto