@@ -379,10 +379,27 @@ static int coproc_mmap(struct file *fp, struct vm_area_struct *vma)
return -EACCES;
}
+ /*
+ * The initial mapping is done after the window is opened
+ * with ioctl. But this window might have been closed
+ * due to lost credit (core removal on PowerVM) before mmap().
+ * So if the window is not active, return mmap() failure
+ * with -EACCES and expects the user space reconfigure (mmap)
+ * window when it is active again or open new window when
+ * the credit is available.
+ */
+ mutex_lock(&txwin->task_ref.mmap_mutex);
+ if (txwin->status != VAS_WIN_ACTIVE) {
+ pr_err("%s(): Window is not active\n", __func__);
+ rc = -EACCES;
+ goto out;
+ }
+
paste_addr = cp_inst->coproc->vops->paste_addr(txwin);
if (!paste_addr) {
pr_err("%s(): Window paste address failed\n", __func__);
- return -EINVAL;
+ rc = -EINVAL;
+ goto out;
}
pfn = paste_addr >> PAGE_SHIFT;
@@ -401,6 +418,8 @@ static int coproc_mmap(struct file *fp, struct vm_area_struct *vma)
txwin->task_ref.vma = vma;
+out:
+ mutex_unlock(&txwin->task_ref.mmap_mutex);
return rc;
}
The paste address mapping is done with mmap() after the window is opened with ioctl. But the window can be closed due to lost credit due to core removal before mmap(). So if the window is not active, return mmap() failure with -EACCES and expects the user space reissue mmap() when the window is active or open new window when the credit is available. Signed-off-by: Haren Myneni <haren@linux.ibm.com> --- arch/powerpc/platforms/book3s/vas-api.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)