• D
    [PATCH] mm: D-cache aliasing issue in cow_user_page · c4ec7b0d
    Dmitriy Monakhov 提交于
    --=-=-=
    
     from mm/memory.c:
      1434  static inline void cow_user_page(struct page *dst, struct page *src, unsigned long va)
      1435  {
      1436          /*
      1437           * If the source page was a PFN mapping, we don't have
      1438           * a "struct page" for it. We do a best-effort copy by
      1439           * just copying from the original user address. If that
      1440           * fails, we just zero-fill it. Live with it.
      1441           */
      1442          if (unlikely(!src)) {
      1443                  void *kaddr = kmap_atomic(dst, KM_USER0);
      1444                  void __user *uaddr = (void __user *)(va & PAGE_MASK);
      1445
      1446                  /*
      1447                   * This really shouldn't fail, because the page is there
      1448                   * in the page tables. But it might just be unreadable,
      1449                   * in which case we just give up and fill the result with
      1450                   * zeroes.
      1451                   */
      1452                  if (__copy_from_user_inatomic(kaddr, uaddr, PAGE_SIZE))
      1453                          memset(kaddr, 0, PAGE_SIZE);
      1454                  kunmap_atomic(kaddr, KM_USER0);
      #### D-cache have to be flushed here.
      #### It seems it is just forgotten.
    
      1455                  return;
      1456
      1457          }
      1458          copy_user_highpage(dst, src, va);
      #### Ok here. flush_dcache_page() called from this func if arch need it
      1459  }
    
    Following is the patch  fix this issue:
    Signed-off-by: NDmitriy Monakhov <dmonakhov@openvz.org>
    Cc: "David S. Miller" <davem@davemloft.net>
    Signed-off-by: NAndrew Morton <akpm@osdl.org>
    Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
    c4ec7b0d
memory.c 71.4 KB