lkml.org 
[lkml]   [2019]   [Feb]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.20 33/50] powerpc/papr_scm: Use the correct bind address
    Date
    4.20-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Oliver O'Halloran <oohall@gmail.com>

    commit 5a3840a470c41ec0b85cd36ca80370330656b163 upstream.

    When binding an SCM volume to a physical address the hypervisor has the
    option to return early with a continue token with the expectation that
    the guest will resume the bind operation until it completes. A quirk of
    this interface is that the bind address will only be returned by the
    first bind h-call and the subsequent calls will return
    0xFFFF_FFFF_FFFF_FFFF for the bind address.

    We currently do not save the address returned by the first h-call. As a
    result we will use the junk address as the base of the bound region if
    the hypervisor decides to split the bind across multiple h-calls. This
    bug was found when testing with very large SCM volumes where the bind
    process would take more time than they hypervisor's internal h-call time
    limit would allow. This patch fixes the issue by saving the bind address
    from the first call.

    Cc: stable@vger.kernel.org
    Fixes: b5beae5e224f ("powerpc/pseries: Add driver for PAPR SCM regions")
    Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/powerpc/platforms/pseries/papr_scm.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    --- a/arch/powerpc/platforms/pseries/papr_scm.c
    +++ b/arch/powerpc/platforms/pseries/papr_scm.c
    @@ -43,6 +43,7 @@ static int drc_pmem_bind(struct papr_scm
    {
    unsigned long ret[PLPAR_HCALL_BUFSIZE];
    uint64_t rc, token;
    + uint64_t saved = 0;

    /*
    * When the hypervisor cannot map all the requested memory in a single
    @@ -56,6 +57,8 @@ static int drc_pmem_bind(struct papr_scm
    rc = plpar_hcall(H_SCM_BIND_MEM, ret, p->drc_index, 0,
    p->blocks, BIND_ANY_ADDR, token);
    token = ret[0];
    + if (!saved)
    + saved = ret[1];
    cond_resched();
    } while (rc == H_BUSY);

    @@ -64,7 +67,7 @@ static int drc_pmem_bind(struct papr_scm
    return -ENXIO;
    }

    - p->bound_addr = ret[1];
    + p->bound_addr = saved;

    dev_dbg(&p->pdev->dev, "bound drc %x to %pR\n", p->drc_index, &p->res);


    \
     
     \ /
      Last update: 2019-02-13 19:49    [W:4.838 / U:1.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site