| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> |
| Date: Fri, 10 Mar 2017 11:34:20 -0700 |
| Subject: infiniband: Fix alignment of mmap cookies to support VIPT caching |
| |
| 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); |
| |