[PATCH v4 5/9] powerpc/vas: Map paste address only if window is active
Nicholas Piggin
npiggin at gmail.com
Wed Feb 23 18:11:46 AEDT 2022
Excerpts from Haren Myneni's message of February 20, 2022 5:59 am:
>
> The paste address mapping is done with mmap() after the window is
> opened with ioctl. If the window is closed by OS in the hypervisor
> due to DLPAR after this mmap(), the paste instruction returns
I don't think the changelog was improved here.
The window is closed by the OS in response to a DLPAR operation
by the hypervisor? The OS can't be in the hypervisor.
> failure until the OS reopens this window again. But before mmap(),
> DLPAR core removal can happen which causes the corresponding
> window in-active. 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 a new window when the credit
> is available.
>
> Signed-off-by: Haren Myneni <haren at linux.ibm.com>
> ---
> arch/powerpc/platforms/book3s/vas-api.c | 20 +++++++++++++++++++-
> 1 file changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/arch/powerpc/platforms/book3s/vas-api.c b/arch/powerpc/platforms/book3s/vas-api.c
> index f3e421511ea6..eb4489b2b46b 100644
> --- a/arch/powerpc/platforms/book3s/vas-api.c
> +++ b/arch/powerpc/platforms/book3s/vas-api.c
> @@ -496,10 +496,26 @@ static int coproc_mmap(struct file *fp, struct vm_area_struct *vma)
> return -EACCES;
> }
>
> + /*
> + * The initial mmap is done after the window is opened
> + * with ioctl. But before mmap(), this window can be closed in
> + * the hypervisor due to lost credit (core removal on pseries).
> + * So if the window is not active, return mmap() failure with
> + * -EACCES and expects the user space reissue mmap() 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;
> @@ -519,6 +535,8 @@ static int coproc_mmap(struct file *fp, struct vm_area_struct *vma)
> txwin->task_ref.vma = vma;
> vma->vm_ops = &vas_vm_ops;
>
> +out:
> + mutex_unlock(&txwin->task_ref.mmap_mutex);
Did we have an explanation or what mmap_mutex is protecting? Sorry if
you explained it and I forgot -- would be good to have a small comment
(what is it protecting against).
Thanks,
Nick
More information about the Linuxppc-dev
mailing list