From: Kommula Shiva Shankar <[email protected]>

[ Upstream commit 5145b277309f3818e2db507f525d19ac3b910922 ]

Explicitly set non-cached caching attributes for MMIO regions.
Default write-back mode can cause CPU to cache device memory,
causing invalid reads and unpredictable behavior.

Invalid read and write issues were observed on ARM64 when mapping the
notification area to userspace via mmap.

Signed-off-by: Kommula Shiva Shankar <[email protected]>
Acked-by: Jason Wang <[email protected]>
Reviewed-by: Jason Gunthorpe <[email protected]>
Signed-off-by: Michael S. Tsirkin <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---

LLM Generated explanations, may be completely bogus:

The mmap functionality has been there since `ddd89d0a059d8` which
introduced doorbell mapping. This fix would apply to all stable trees
that have this function.

### Summary

This is a textbook stable kernel fix:

1. **Obviously correct**: MMIO must be mapped non-cacheable; this is a
   fundamental hardware requirement. Every other MMIO mmap in the kernel
   uses `pgprot_noncached()` or similar.
2. **Fixes a real bug**: Invalid reads/writes on ARM64 — this causes
   device malfunction and potential data corruption.
3. **Small and contained**: Single line addition, no side effects.
4. **No new features**: Just corrects existing mmap behavior to follow
   hardware requirements.
5. **Low risk**: `pgprot_noncached()` is the standard, well-understood
   kernel API for this exact purpose.
6. **High-quality review**: Three expert maintainers
   reviewed/acked/committed.
7. **Self-contained**: No dependencies on other commits.

**YES**

 drivers/vhost/vdpa.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c
index 05a481e4c385a..b0179e8567aba 100644
--- a/drivers/vhost/vdpa.c
+++ b/drivers/vhost/vdpa.c
@@ -1527,6 +1527,7 @@ static int vhost_vdpa_mmap(struct file *file, struct 
vm_area_struct *vma)
        if (vma->vm_end - vma->vm_start != notify.size)
                return -ENOTSUPP;
 
+       vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
        vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
        vma->vm_ops = &vhost_vdpa_vm_ops;
        return 0;
-- 
2.51.0


Reply via email to