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 <ha...@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

Reply via email to