aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2008-11-11 10:22:22 +1100
committerJeremy Kerr <jk@ozlabs.org>2008-11-21 10:14:16 +1100
commit606572634c3faa5b32a8fc430266e6e9d78d2179 (patch)
tree9ae7cd7985d1d04f40f4e2260b32b671968432f5 /arch
parent34318c253b861f82bd4a2956e6c8ae8ee2c3aae7 (diff)
downloadkernel_goldelico_gta04-606572634c3faa5b32a8fc430266e6e9d78d2179.zip
kernel_goldelico_gta04-606572634c3faa5b32a8fc430266e6e9d78d2179.tar.gz
kernel_goldelico_gta04-606572634c3faa5b32a8fc430266e6e9d78d2179.tar.bz2
powerpc/spufs: Fix spinning in spufs_ps_fault on signal
Currently, we can end up in an infinite loop if we get a signal while the kernel has faulted in spufs_ps_fault. Eg: alarm(1); write(fd, some_spu_psmap_register_address, 4); - the write's copy_from_user will fault on the ps mapping, and signal_pending will be non-zero. Because returning from the fault handler will never clear TIF_SIGPENDING, so we'll just keep faulting, resulting in an unkillable process using 100% of CPU. This change returns VM_FAULT_SIGBUS if there's a fatal signal pending, letting us escape the loop. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/platforms/cell/spufs/file.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c
index b73c369..1b26071 100644
--- a/arch/powerpc/platforms/cell/spufs/file.c
+++ b/arch/powerpc/platforms/cell/spufs/file.c
@@ -390,6 +390,9 @@ static int spufs_ps_fault(struct vm_area_struct *vma,
if (offset >= ps_size)
return VM_FAULT_SIGBUS;
+ if (fatal_signal_pending(current))
+ return VM_FAULT_SIGBUS;
+
/*
* Because we release the mmap_sem, the context may be destroyed while
* we're in spu_wait. Grab an extra reference so it isn't destroyed