lkml.org 
[lkml]   [2009]   [Nov]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] mtd: fix mtd_blkdevs problem with caches on some architectures (2.6.31)
    On Wed, 18 Nov 2009 17:08:10 +0300
    Ilya Loginov <isloginov@gmail.com> wrote:

    > Mtdblock driver doesn't call flush_dcache_page for pages in request.
    > This may cause problem on architectures where icache doesn't fill from
    > dcache or with dcache aliases.
    > This patch resolves this issue.
    >
    > Signed-off-by: Ilya Loginov <isloginov@gmail.com>
    > ---
    > mtd_blkdevs.c | 7 +++++++
    > 1 file changed, 7 insertions(+)
    >
    > diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
    > index 7baba40..59d5d25 100644
    > --- a/drivers/mtd/mtd_blkdevs.c
    > +++ b/drivers/mtd/mtd_blkdevs.c
    > @@ -46,6 +46,8 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
    > {
    > unsigned long block, nsect;
    > char *buf;
    > + struct req_iterator iter;
    > + struct bio_vec *bvec;
    >
    > block = blk_rq_pos(req) << 9 >> tr->blkshift;
    > nsect = blk_rq_cur_bytes(req) >> tr->blkshift;
    > @@ -68,12 +70,17 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
    > for (; nsect > 0; nsect--, block++, buf += tr->blksize)
    > if (tr->readsect(dev, block, buf))
    > return -EIO;
    > + rq_for_each_segment(bvec, req, iter)
    > + flush_dcache_page(bvec->bv_page);
    > return 0;
    >
    > case WRITE:
    > if (!tr->writesect)
    > return -EIO;
    >
    > + rq_for_each_segment(bvec, req, iter)
    > + flush_dcache_page(bvec->bv_page);
    > +
    > for (; nsect > 0; nsect--, block++, buf += tr->blksize)
    > if (tr->writesect(dev, block, buf))
    > return -EIO;

    Please see the recent linux-kernel thread "prevent AoE causing cache
    aliases".

    Your patch fixes bascially the same problem in MTD as we have in AOE.
    And it introduces the same problem as well - pointless empty
    cache-thrashing loops on architectures for which flush_dcache_page() is
    a no-op.

    What would be better here would be for block core to add a new
    rq_flush_dcache_pages() and bio_flush_dcache_pages() which the drivers
    can call. Those functions would be a no-op on architectures which
    don't need them.

    Jens has made noises about implementing this, but he is working on his
    suntan this week.



    \
     
     \ /
      Last update: 2009-11-21 01:41    [W:0.040 / U:0.824 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site