From: popcornmix Date: Tue, 2 May 2017 15:36:05 +0000 (+0100) Subject: vcsm: Treat EBUSY as success rather than SIGBUS X-Git-Tag: archive/raspbian/4.9.51-1+rpi1~5^2~290 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=1c8052772117fde7935b3cefa7000b8f3bdf9040;p=linux-4.9.git vcsm: Treat EBUSY as success rather than SIGBUS Currently if two cores access the same page concurrently one will return VM_FAULT_NOPAGE and the other VM_FAULT_SIGBUS crashing the user code. Also report when mapping fails. Signed-off-by: popcornmix --- diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c index 1db6716c2c0c..ee4e05948c43 100644 --- a/drivers/char/broadcom/vc_sm/vmcs_sm.c +++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c @@ -1181,11 +1181,20 @@ static int vcsm_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) switch (ret) { case 0: case -ERESTARTSYS: + /* + * EBUSY is ok: this just means that another thread + * already did the job. + */ + case -EBUSY: return VM_FAULT_NOPAGE; case -ENOMEM: case -EAGAIN: + pr_err("[%s]: failed to map page pfn:%lx virt:%lx ret:%d\n", __func__, + pfn, (unsigned long)vmf->virtual_address, ret); return VM_FAULT_OOM; default: + pr_err("[%s]: failed to map page pfn:%lx virt:%lx ret:%d\n", __func__, + pfn, (unsigned long)vmf->virtual_address, ret); return VM_FAULT_SIGBUS; } }