diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2008-11-10 18:22:22 -0500 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2008-11-20 18:14:16 -0500 |
commit | 606572634c3faa5b32a8fc430266e6e9d78d2179 (patch) | |
tree | 9ae7cd7985d1d04f40f4e2260b32b671968432f5 | |
parent | 34318c253b861f82bd4a2956e6c8ae8ee2c3aae7 (diff) |
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>
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/file.c | 3 |
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 b73c369cc6f1..1b26071a86ca 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, | |||
390 | if (offset >= ps_size) | 390 | if (offset >= ps_size) |
391 | return VM_FAULT_SIGBUS; | 391 | return VM_FAULT_SIGBUS; |
392 | 392 | ||
393 | if (fatal_signal_pending(current)) | ||
394 | return VM_FAULT_SIGBUS; | ||
395 | |||
393 | /* | 396 | /* |
394 | * Because we release the mmap_sem, the context may be destroyed while | 397 | * Because we release the mmap_sem, the context may be destroyed while |
395 | * we're in spu_wait. Grab an extra reference so it isn't destroyed | 398 | * we're in spu_wait. Grab an extra reference so it isn't destroyed |