Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha-2.6:
  alpha: deal with multiple simultaneously pending signals
  alpha: fix a 14 years old bug in sigreturn tracing
  alpha: unb0rk sigsuspend() and rt_sigsuspend()
  alpha: belated ERESTART_RESTARTBLOCK race fix
  alpha: Shift perf event pending work earlier in timer interrupt
  alpha: wire up fanotify and prlimit64 syscalls
  alpha: kill big kernel lock
  alpha: fix build breakage in asm/cacheflush.h
  alpha: remove unnecessary cast from void* in assignment.
  alpha: Use static const char * const where possible
This commit is contained in:
Linus Torvalds 2010-09-19 11:09:23 -07:00
commit 2422084a94
13 changed files with 88 additions and 131 deletions

View File

@ -43,6 +43,8 @@ extern void smp_imb(void);
/* ??? Ought to use this in arch/alpha/kernel/signal.c too. */ /* ??? Ought to use this in arch/alpha/kernel/signal.c too. */
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
#include <linux/sched.h>
extern void __load_new_mm_context(struct mm_struct *); extern void __load_new_mm_context(struct mm_struct *);
static inline void static inline void
flush_icache_user_range(struct vm_area_struct *vma, struct page *page, flush_icache_user_range(struct vm_area_struct *vma, struct page *page,

View File

@ -449,10 +449,13 @@
#define __NR_pwritev 491 #define __NR_pwritev 491
#define __NR_rt_tgsigqueueinfo 492 #define __NR_rt_tgsigqueueinfo 492
#define __NR_perf_event_open 493 #define __NR_perf_event_open 493
#define __NR_fanotify_init 494
#define __NR_fanotify_mark 495
#define __NR_prlimit64 496
#ifdef __KERNEL__ #ifdef __KERNEL__
#define NR_SYSCALLS 494 #define NR_SYSCALLS 497
#define __ARCH_WANT_IPC_PARSE_VERSION #define __ARCH_WANT_IPC_PARSE_VERSION
#define __ARCH_WANT_OLD_READDIR #define __ARCH_WANT_OLD_READDIR
@ -463,6 +466,7 @@
#define __ARCH_WANT_SYS_OLD_GETRLIMIT #define __ARCH_WANT_SYS_OLD_GETRLIMIT
#define __ARCH_WANT_SYS_OLDUMOUNT #define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING #define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
/* "Conditional" syscalls. What we want is /* "Conditional" syscalls. What we want is

View File

@ -317,14 +317,14 @@ ret_from_sys_call:
ldq $0, SP_OFF($sp) ldq $0, SP_OFF($sp)
and $0, 8, $0 and $0, 8, $0
beq $0, restore_all beq $0, restore_all
ret_from_reschedule: ret_to_user:
/* Make sure need_resched and sigpending don't change between /* Make sure need_resched and sigpending don't change between
sampling and the rti. */ sampling and the rti. */
lda $16, 7 lda $16, 7
call_pal PAL_swpipl call_pal PAL_swpipl
ldl $5, TI_FLAGS($8) ldl $5, TI_FLAGS($8)
and $5, _TIF_WORK_MASK, $2 and $5, _TIF_WORK_MASK, $2
bne $5, work_pending bne $2, work_pending
restore_all: restore_all:
RESTORE_ALL RESTORE_ALL
call_pal PAL_rti call_pal PAL_rti
@ -363,7 +363,7 @@ $ret_success:
* $8: current. * $8: current.
* $19: The old syscall number, or zero if this is not a return * $19: The old syscall number, or zero if this is not a return
* from a syscall that errored and is possibly restartable. * from a syscall that errored and is possibly restartable.
* $20: Error indication. * $20: The old a3 value
*/ */
.align 4 .align 4
@ -392,12 +392,18 @@ $work_resched:
$work_notifysig: $work_notifysig:
mov $sp, $16 mov $sp, $16
br $1, do_switch_stack bsr $1, do_switch_stack
mov $sp, $17 mov $sp, $17
mov $5, $18 mov $5, $18
mov $19, $9 /* save old syscall number */
mov $20, $10 /* save old a3 */
and $5, _TIF_SIGPENDING, $2
cmovne $2, 0, $9 /* we don't want double syscall restarts */
jsr $26, do_notify_resume jsr $26, do_notify_resume
mov $9, $19
mov $10, $20
bsr $1, undo_switch_stack bsr $1, undo_switch_stack
br restore_all br ret_to_user
.end work_pending .end work_pending
/* /*
@ -430,6 +436,7 @@ strace:
beq $1, 1f beq $1, 1f
ldq $27, 0($2) ldq $27, 0($2)
1: jsr $26, ($27), sys_gettimeofday 1: jsr $26, ($27), sys_gettimeofday
ret_from_straced:
ldgp $gp, 0($26) ldgp $gp, 0($26)
/* check return.. */ /* check return.. */
@ -757,11 +764,15 @@ sys_vfork:
.ent sys_sigreturn .ent sys_sigreturn
sys_sigreturn: sys_sigreturn:
.prologue 0 .prologue 0
lda $9, ret_from_straced
cmpult $26, $9, $9
mov $sp, $17 mov $sp, $17
lda $18, -SWITCH_STACK_SIZE($sp) lda $18, -SWITCH_STACK_SIZE($sp)
lda $sp, -SWITCH_STACK_SIZE($sp) lda $sp, -SWITCH_STACK_SIZE($sp)
jsr $26, do_sigreturn jsr $26, do_sigreturn
br $1, undo_switch_stack bne $9, 1f
jsr $26, syscall_trace
1: br $1, undo_switch_stack
br ret_from_sys_call br ret_from_sys_call
.end sys_sigreturn .end sys_sigreturn
@ -770,46 +781,18 @@ sys_sigreturn:
.ent sys_rt_sigreturn .ent sys_rt_sigreturn
sys_rt_sigreturn: sys_rt_sigreturn:
.prologue 0 .prologue 0
lda $9, ret_from_straced
cmpult $26, $9, $9
mov $sp, $17 mov $sp, $17
lda $18, -SWITCH_STACK_SIZE($sp) lda $18, -SWITCH_STACK_SIZE($sp)
lda $sp, -SWITCH_STACK_SIZE($sp) lda $sp, -SWITCH_STACK_SIZE($sp)
jsr $26, do_rt_sigreturn jsr $26, do_rt_sigreturn
br $1, undo_switch_stack bne $9, 1f
jsr $26, syscall_trace
1: br $1, undo_switch_stack
br ret_from_sys_call br ret_from_sys_call
.end sys_rt_sigreturn .end sys_rt_sigreturn
.align 4
.globl sys_sigsuspend
.ent sys_sigsuspend
sys_sigsuspend:
.prologue 0
mov $sp, $17
br $1, do_switch_stack
mov $sp, $18
subq $sp, 16, $sp
stq $26, 0($sp)
jsr $26, do_sigsuspend
ldq $26, 0($sp)
lda $sp, SWITCH_STACK_SIZE+16($sp)
ret
.end sys_sigsuspend
.align 4
.globl sys_rt_sigsuspend
.ent sys_rt_sigsuspend
sys_rt_sigsuspend:
.prologue 0
mov $sp, $18
br $1, do_switch_stack
mov $sp, $19
subq $sp, 16, $sp
stq $26, 0($sp)
jsr $26, do_rt_sigsuspend
ldq $26, 0($sp)
lda $sp, SWITCH_STACK_SIZE+16($sp)
ret
.end sys_rt_sigsuspend
.align 4 .align 4
.globl sys_sethae .globl sys_sethae
.ent sys_sethae .ent sys_sethae

View File

@ -90,11 +90,13 @@ static int
ev6_parse_cbox(u64 c_addr, u64 c1_syn, u64 c2_syn, ev6_parse_cbox(u64 c_addr, u64 c1_syn, u64 c2_syn,
u64 c_stat, u64 c_sts, int print) u64 c_stat, u64 c_sts, int print)
{ {
char *sourcename[] = { "UNKNOWN", "UNKNOWN", "UNKNOWN", static const char * const sourcename[] = {
"UNKNOWN", "UNKNOWN", "UNKNOWN",
"MEMORY", "BCACHE", "DCACHE", "MEMORY", "BCACHE", "DCACHE",
"BCACHE PROBE", "BCACHE PROBE" }; "BCACHE PROBE", "BCACHE PROBE"
char *streamname[] = { "D", "I" }; };
char *bitsname[] = { "SINGLE", "DOUBLE" }; static const char * const streamname[] = { "D", "I" };
static const char * const bitsname[] = { "SINGLE", "DOUBLE" };
int status = MCHK_DISPOSITION_REPORT; int status = MCHK_DISPOSITION_REPORT;
int source = -1, stream = -1, bits = -1; int source = -1, stream = -1, bits = -1;

View File

@ -589,7 +589,8 @@ marvel_print_pox_spl_cmplt(u64 spl_cmplt)
static void static void
marvel_print_pox_trans_sum(u64 trans_sum) marvel_print_pox_trans_sum(u64 trans_sum)
{ {
char *pcix_cmd[] = { "Interrupt Acknowledge", static const char * const pcix_cmd[] = {
"Interrupt Acknowledge",
"Special Cycle", "Special Cycle",
"I/O Read", "I/O Read",
"I/O Write", "I/O Write",

View File

@ -75,8 +75,12 @@ titan_parse_p_serror(int which, u64 serror, int print)
int status = MCHK_DISPOSITION_REPORT; int status = MCHK_DISPOSITION_REPORT;
#ifdef CONFIG_VERBOSE_MCHECK #ifdef CONFIG_VERBOSE_MCHECK
char *serror_src[] = {"GPCI", "APCI", "AGP HP", "AGP LP"}; static const char * const serror_src[] = {
char *serror_cmd[] = {"DMA Read", "DMA RMW", "SGTE Read", "Reserved"}; "GPCI", "APCI", "AGP HP", "AGP LP"
};
static const char * const serror_cmd[] = {
"DMA Read", "DMA RMW", "SGTE Read", "Reserved"
};
#endif /* CONFIG_VERBOSE_MCHECK */ #endif /* CONFIG_VERBOSE_MCHECK */
#define TITAN__PCHIP_SERROR__LOST_UECC (1UL << 0) #define TITAN__PCHIP_SERROR__LOST_UECC (1UL << 0)
@ -140,14 +144,15 @@ titan_parse_p_perror(int which, int port, u64 perror, int print)
int status = MCHK_DISPOSITION_REPORT; int status = MCHK_DISPOSITION_REPORT;
#ifdef CONFIG_VERBOSE_MCHECK #ifdef CONFIG_VERBOSE_MCHECK
char *perror_cmd[] = { "Interrupt Acknowledge", "Special Cycle", static const char * const perror_cmd[] = {
"Interrupt Acknowledge", "Special Cycle",
"I/O Read", "I/O Write", "I/O Read", "I/O Write",
"Reserved", "Reserved", "Reserved", "Reserved",
"Memory Read", "Memory Write", "Memory Read", "Memory Write",
"Reserved", "Reserved", "Reserved", "Reserved",
"Configuration Read", "Configuration Write", "Configuration Read", "Configuration Write",
"Memory Read Multiple", "Dual Address Cycle", "Memory Read Multiple", "Dual Address Cycle",
"Memory Read Line","Memory Write and Invalidate" "Memory Read Line", "Memory Write and Invalidate"
}; };
#endif /* CONFIG_VERBOSE_MCHECK */ #endif /* CONFIG_VERBOSE_MCHECK */
@ -273,9 +278,9 @@ titan_parse_p_agperror(int which, u64 agperror, int print)
int cmd, len; int cmd, len;
unsigned long addr; unsigned long addr;
char *agperror_cmd[] = { "Read (low-priority)", "Read (high-priority)", static const char * const agperror_cmd[] = {
"Write (low-priority)", "Read (low-priority)", "Read (high-priority)",
"Write (high-priority)", "Write (low-priority)", "Write (high-priority)",
"Reserved", "Reserved", "Reserved", "Reserved",
"Flush", "Fence" "Flush", "Fence"
}; };

View File

@ -15,7 +15,6 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/unistd.h> #include <linux/unistd.h>
@ -69,7 +68,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start,
{ {
struct mm_struct *mm; struct mm_struct *mm;
lock_kernel();
mm = current->mm; mm = current->mm;
mm->end_code = bss_start + bss_len; mm->end_code = bss_start + bss_len;
mm->start_brk = bss_start + bss_len; mm->start_brk = bss_start + bss_len;
@ -78,7 +76,6 @@ SYSCALL_DEFINE4(osf_set_program_attributes, unsigned long, text_start,
printk("set_program_attributes(%lx %lx %lx %lx)\n", printk("set_program_attributes(%lx %lx %lx %lx)\n",
text_start, text_len, bss_start, bss_len); text_start, text_len, bss_start, bss_len);
#endif #endif
unlock_kernel();
return 0; return 0;
} }
@ -517,7 +514,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
long error; long error;
int __user *min_buf_size_ptr; int __user *min_buf_size_ptr;
lock_kernel();
switch (code) { switch (code) {
case PL_SET: case PL_SET:
if (get_user(error, &args->set.nbytes)) if (get_user(error, &args->set.nbytes))
@ -547,7 +543,6 @@ SYSCALL_DEFINE2(osf_proplist_syscall, enum pl_code, code,
error = -EOPNOTSUPP; error = -EOPNOTSUPP;
break; break;
}; };
unlock_kernel();
return error; return error;
} }
@ -594,7 +589,7 @@ SYSCALL_DEFINE2(osf_sigstack, struct sigstack __user *, uss,
SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count) SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
{ {
char *sysinfo_table[] = { const char *sysinfo_table[] = {
utsname()->sysname, utsname()->sysname,
utsname()->nodename, utsname()->nodename,
utsname()->release, utsname()->release,
@ -606,7 +601,7 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
"dummy", /* secure RPC domain */ "dummy", /* secure RPC domain */
}; };
unsigned long offset; unsigned long offset;
char *res; const char *res;
long len, err = -EINVAL; long len, err = -EINVAL;
offset = command-1; offset = command-1;

View File

@ -66,7 +66,7 @@ static int pci_mmap_resource(struct kobject *kobj,
{ {
struct pci_dev *pdev = to_pci_dev(container_of(kobj, struct pci_dev *pdev = to_pci_dev(container_of(kobj,
struct device, kobj)); struct device, kobj));
struct resource *res = (struct resource *)attr->private; struct resource *res = attr->private;
enum pci_mmap_state mmap_type; enum pci_mmap_state mmap_type;
struct pci_bus_region bar; struct pci_bus_region bar;
int i; int i;

View File

@ -144,8 +144,7 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
/* /*
* Atomically swap in the new signal mask, and wait for a signal. * Atomically swap in the new signal mask, and wait for a signal.
*/ */
asmlinkage int SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask)
do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
{ {
mask &= _BLOCKABLE; mask &= _BLOCKABLE;
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
@ -154,41 +153,6 @@ do_sigsuspend(old_sigset_t mask, struct pt_regs *regs, struct switch_stack *sw)
recalc_sigpending(); recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock); spin_unlock_irq(&current->sighand->siglock);
/* Indicate EINTR on return from any possible signal handler,
which will not come back through here, but via sigreturn. */
regs->r0 = EINTR;
regs->r19 = 1;
current->state = TASK_INTERRUPTIBLE;
schedule();
set_thread_flag(TIF_RESTORE_SIGMASK);
return -ERESTARTNOHAND;
}
asmlinkage int
do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
struct pt_regs *regs, struct switch_stack *sw)
{
sigset_t set;
/* XXX: Don't preclude handling different sized sigset_t's. */
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
if (copy_from_user(&set, uset, sizeof(set)))
return -EFAULT;
sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(&current->sighand->siglock);
current->saved_sigmask = current->blocked;
current->blocked = set;
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
/* Indicate EINTR on return from any possible signal handler,
which will not come back through here, but via sigreturn. */
regs->r0 = EINTR;
regs->r19 = 1;
current->state = TASK_INTERRUPTIBLE; current->state = TASK_INTERRUPTIBLE;
schedule(); schedule();
set_thread_flag(TIF_RESTORE_SIGMASK); set_thread_flag(TIF_RESTORE_SIGMASK);
@ -239,6 +203,8 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
unsigned long usp; unsigned long usp;
long i, err = __get_user(regs->pc, &sc->sc_pc); long i, err = __get_user(regs->pc, &sc->sc_pc);
current_thread_info()->restart_block.fn = do_no_restart_syscall;
sw->r26 = (unsigned long) ret_from_sys_call; sw->r26 = (unsigned long) ret_from_sys_call;
err |= __get_user(regs->r0, sc->sc_regs+0); err |= __get_user(regs->r0, sc->sc_regs+0);
@ -591,7 +557,6 @@ syscall_restart(unsigned long r0, unsigned long r19,
regs->pc -= 4; regs->pc -= 4;
break; break;
case ERESTART_RESTARTBLOCK: case ERESTART_RESTARTBLOCK:
current_thread_info()->restart_block.fn = do_no_restart_syscall;
regs->r0 = EINTR; regs->r0 = EINTR;
break; break;
} }

View File

@ -87,7 +87,7 @@ static int srm_env_proc_show(struct seq_file *m, void *v)
srm_env_t *entry; srm_env_t *entry;
char *page; char *page;
entry = (srm_env_t *)m->private; entry = m->private;
page = (char *)__get_free_page(GFP_USER); page = (char *)__get_free_page(GFP_USER);
if (!page) if (!page)
return -ENOMEM; return -ENOMEM;

View File

@ -512,6 +512,9 @@ sys_call_table:
.quad sys_pwritev .quad sys_pwritev
.quad sys_rt_tgsigqueueinfo .quad sys_rt_tgsigqueueinfo
.quad sys_perf_event_open .quad sys_perf_event_open
.quad sys_fanotify_init
.quad sys_fanotify_mark /* 495 */
.quad sys_prlimit64
.size sys_call_table, . - sys_call_table .size sys_call_table, . - sys_call_table
.type sys_call_table, @object .type sys_call_table, @object

View File

@ -191,16 +191,16 @@ irqreturn_t timer_interrupt(int irq, void *dev)
write_sequnlock(&xtime_lock); write_sequnlock(&xtime_lock);
#ifndef CONFIG_SMP
while (nticks--)
update_process_times(user_mode(get_irq_regs()));
#endif
if (test_perf_event_pending()) { if (test_perf_event_pending()) {
clear_perf_event_pending(); clear_perf_event_pending();
perf_event_do_pending(); perf_event_do_pending();
} }
#ifndef CONFIG_SMP
while (nticks--)
update_process_times(user_mode(get_irq_regs()));
#endif
return IRQ_HANDLED; return IRQ_HANDLED;
} }

View File

@ -13,7 +13,6 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/tty.h> #include <linux/tty.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/smp_lock.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
@ -623,7 +622,6 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
return; return;
} }
lock_kernel();
printk("Bad unaligned kernel access at %016lx: %p %lx %lu\n", printk("Bad unaligned kernel access at %016lx: %p %lx %lu\n",
pc, va, opcode, reg); pc, va, opcode, reg);
do_exit(SIGSEGV); do_exit(SIGSEGV);
@ -646,7 +644,6 @@ got_exception:
* Yikes! No one to forward the exception to. * Yikes! No one to forward the exception to.
* Since the registers are in a weird format, dump them ourselves. * Since the registers are in a weird format, dump them ourselves.
*/ */
lock_kernel();
printk("%s(%d): unhandled unaligned exception\n", printk("%s(%d): unhandled unaligned exception\n",
current->comm, task_pid_nr(current)); current->comm, task_pid_nr(current));