lkml.org 
[lkml]   [2017]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 046/104] infiniband: Fix alignment of mmap cookies to support VIPT caching
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

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

    From: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>


    [ Upstream commit cb8864559631754ac93d5734b165ccd0cad4728c ]

    When vmalloc_user is used to create memory that is supposed to be mmap'd
    to user space, it is necessary for the mmap cookie (eg the offset) to be
    aligned to SHMLBA.

    This creates a situation where all virtual mappings of the same physical
    page share the same virtual cache index and guarantees VIPT coherence.
    Otherwise the cache is non-coherent and the kernel will not see writes
    by userspace when reading the shared page (or vice-versa).

    Reported-by: Josh Beavers <josh.beavers@gmail.com>
    Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
    Signed-off-by: Doug Ledford <dledford@redhat.com>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/infiniband/sw/rdmavt/mmap.c | 4 ++--
    drivers/infiniband/sw/rxe/rxe_mmap.c | 4 ++--
    2 files changed, 4 insertions(+), 4 deletions(-)

    --- a/drivers/infiniband/sw/rdmavt/mmap.c
    +++ b/drivers/infiniband/sw/rdmavt/mmap.c
    @@ -170,9 +170,9 @@ struct rvt_mmap_info *rvt_create_mmap_in

    spin_lock_irq(&rdi->mmap_offset_lock);
    if (rdi->mmap_offset == 0)
    - rdi->mmap_offset = PAGE_SIZE;
    + rdi->mmap_offset = ALIGN(PAGE_SIZE, SHMLBA);
    ip->offset = rdi->mmap_offset;
    - rdi->mmap_offset += size;
    + rdi->mmap_offset += ALIGN(size, SHMLBA);
    spin_unlock_irq(&rdi->mmap_offset_lock);

    INIT_LIST_HEAD(&ip->pending_mmaps);
    --- a/drivers/infiniband/sw/rxe/rxe_mmap.c
    +++ b/drivers/infiniband/sw/rxe/rxe_mmap.c
    @@ -156,10 +156,10 @@ struct rxe_mmap_info *rxe_create_mmap_in
    spin_lock_bh(&rxe->mmap_offset_lock);

    if (rxe->mmap_offset == 0)
    - rxe->mmap_offset = PAGE_SIZE;
    + rxe->mmap_offset = ALIGN(PAGE_SIZE, SHMLBA);

    ip->info.offset = rxe->mmap_offset;
    - rxe->mmap_offset += size;
    + rxe->mmap_offset += ALIGN(size, SHMLBA);

    spin_unlock_bh(&rxe->mmap_offset_lock);


    \
     
     \ /
      Last update: 2017-12-22 11:24    [W:4.130 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site