lkml.org 
[lkml]   [2009]   [Oct]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH] prevent AoE causing cache aliases
    From
    This patch prevents the AoE block driver from creating cache aliases of
    page cache pages on machines with virtually indexed caches.

    Building kernels on an AT91SAM9G20 board without this patch fails with
    segmentation faults after a couple of passes.

    Signed-off-by: Peter Horton <zero@colonel-panic.org>

    Index: linux-2.6.31/drivers/block/aoe/aoecmd.c
    ===================================================================
    --- linux-2.6.31.orig/drivers/block/aoe/aoecmd.c 2009-09-09 23:13:59.000000000 +0100
    +++ linux-2.6.31/drivers/block/aoe/aoecmd.c 2009-10-22 10:24:50.000000000 +0100
    @@ -735,6 +735,21 @@
    part_stat_unlock();
    }

    +/*
    + * Ensure we don't create aliases in VI caches
    + */
    +static inline void
    +killalias(struct bio *bio)
    +{
    + struct bio_vec *bv;
    + int i;
    +
    + if (bio_data_dir(bio) == READ)
    + __bio_for_each_segment(bv, bio, i, 0) {
    + flush_dcache_page(bv->bv_page);
    + }
    +}
    +
    void
    aoecmd_ata_rsp(struct sk_buff *skb)
    {
    @@ -853,8 +868,12 @@

    if (buf && --buf->nframesout == 0 && buf->resid == 0) {
    diskstats(d->gd, buf->bio, jiffies - buf->stime, buf->sector);
    - n = (buf->flags & BUFFL_FAIL) ? -EIO : 0;
    - bio_endio(buf->bio, n);
    + if (buf->flags & BUFFL_FAIL)
    + bio_endio(buf->bio, -EIO);
    + else {
    + killalias(buf->bio);
    + bio_endio(buf->bio, 0);
    + }
    mempool_free(buf, d->bufpool);
    }


    \
     
     \ /
      Last update: 2009-10-22 16:43    [W:0.022 / U:88.436 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site