From 1c8052772117fde7935b3cefa7000b8f3bdf9040 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 2 May 2017 16:36:05 +0100 Subject: [PATCH] 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 --- drivers/char/broadcom/vc_sm/vmcs_sm.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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; } } -- 2.30.2