lkml.org 
[lkml]   [2012]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRE: [PATCH] dmaengine: async_xor, fix zero address issue when xor highmem page
    Date
    Hello Dan Williams,

    Do you have any comment about this patch?

    Thanks,
    Forrest

    -----Original Message-----
    From: Shi Xuelin-B29237
    Sent: 2011年12月27日 14:31
    To: vinod.koul@intel.com; dan.j.williams@intel.com; linuxppc-dev@lists.ozlabs.org; linux-kernel@vger.kernel.org; Li Yang-R58472
    Cc: Shi Xuelin-B29237
    Subject: [PATCH] dmaengine: async_xor, fix zero address issue when xor highmem page

    From: Forrest shi <b29237@freescale.com>

    we may do_sync_xor high mem pages, in this case, page_address will
    return zero address which cause a failure.

    this patch uses kmap_atomic before xor the pages and kunmap_atomic
    after it.

    Signed-off-by: b29237@freescale.com <xuelin.shi@freescale.com>
    ---
    crypto/async_tx/async_xor.c | 16 ++++++++++++----
    1 files changed, 12 insertions(+), 4 deletions(-)

    diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c index bc28337..5b416d1 100644
    --- a/crypto/async_tx/async_xor.c
    +++ b/crypto/async_tx/async_xor.c
    @@ -26,6 +26,7 @@
    #include <linux/kernel.h>
    #include <linux/interrupt.h>
    #include <linux/mm.h>
    +#include <linux/highmem.h>
    #include <linux/dma-mapping.h>
    #include <linux/raid/xor.h>
    #include <linux/async_tx.h>
    @@ -126,7 +127,7 @@ do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset,
    int src_cnt, size_t len, struct async_submit_ctl *submit) {
    int i;
    - int xor_src_cnt = 0;
    + int xor_src_cnt = 0, kmap_cnt=0;
    int src_off = 0;
    void *dest_buf;
    void **srcs;
    @@ -138,11 +139,13 @@ do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset,

    /* convert to buffer pointers */
    for (i = 0; i < src_cnt; i++)
    - if (src_list[i])
    - srcs[xor_src_cnt++] = page_address(src_list[i]) + offset;
    + if (src_list[i]) {
    + srcs[xor_src_cnt++] = kmap_atomic(src_list[i], KM_USER1) + offset;
    + }
    + kmap_cnt = xor_src_cnt;
    src_cnt = xor_src_cnt;
    /* set destination address */
    - dest_buf = page_address(dest) + offset;
    + dest_buf = kmap_atomic(dest, KM_USER0) + offset;

    if (submit->flags & ASYNC_TX_XOR_ZERO_DST)
    memset(dest_buf, 0, len);
    @@ -157,6 +160,11 @@ do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset,
    src_off += xor_src_cnt;
    }

    + kunmap_atomic(dest_buf, KM_USER0);
    + for (i = 0; i < kmap_cnt; i++)
    + if (src_list[i])
    + kunmap_atomic(srcs[i], KM_USER1);
    +
    async_tx_sync_epilog(submit);
    }

    --
    1.7.0.4



    \
     
     \ /
      Last update: 2012-01-11 08:55    [W:0.026 / U:2.308 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site