Re: [RFC 1/3] block: Context support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Group,

Will you please provide some feedback on the following RFC patches,

[RFC 1/3] block: Context support
[RFC 2/3] ext4: Context support


Regards
Saugata


On 16 May 2012 21:00, Saugata Das <saugata.das@xxxxxxxxxxxxxx> wrote:
> From: Saugata Das <saugata.das@xxxxxxxxxx>
>
> On eMMC and UFS devices there is a new feature of setting context with each
> read or write. The idea is to classify the data from different files and
> apply the realibility on the complete file instead of individual writes,
> which helps in performance. A new address space operation has been a added
> to get the context from file system and set up the bi_context field in bio.
> Then we need to ensure that bio from different contexts are not merged. The
> context is then passed to the underlying driver as part of the read or write
> request. Since the number of MMC contexts is limited, multiple file system
> contexts are mapped to single MMC context.
>
> Signed-off-by: Saugata Das <saugata.das@xxxxxxxxxx>
> ---
>  block/blk-core.c            |    1 +
>  block/blk-merge.c           |    3 +++
>  fs/mpage.c                  |   12 ++++++++++++
>  include/linux/blk_types.h   |    1 +
>  include/linux/blkdev.h      |    1 +
>  include/linux/buffer_head.h |    2 ++
>  include/linux/fs.h          |    1 +
>  7 files changed, 21 insertions(+), 0 deletions(-)
>
> diff --git a/block/blk-core.c b/block/blk-core.c
> index 1f61b74..274e05d 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -1309,6 +1309,7 @@ void init_request_from_bio(struct request *req, struct bio *bio)
>        req->errors = 0;
>        req->__sector = bio->bi_sector;
>        req->ioprio = bio_prio(bio);
> +       req->context = bio->bi_context;
>        blk_rq_bio_prep(req->q, req, bio);
>  }
>
> diff --git a/block/blk-merge.c b/block/blk-merge.c
> index 160035f..ed70d56 100644
> --- a/block/blk-merge.c
> +++ b/block/blk-merge.c
> @@ -497,6 +497,9 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
>        if (bio_integrity(bio) != blk_integrity_rq(rq))
>                return false;
>
> +       if (bio->bi_context != rq->bio->bi_context)
> +               return false;
> +
>        return true;
>  }
>
> diff --git a/fs/mpage.c b/fs/mpage.c
> index 0face1c..4889842 100644
> --- a/fs/mpage.c
> +++ b/fs/mpage.c
> @@ -293,6 +293,12 @@ alloc_new:
>                        goto confused;
>        }
>
> +       if (page && page->mapping && page->mapping->a_ops &&
> +               page->mapping->a_ops->get_context)
> +               bio->bi_context = page->mapping->a_ops->get_context(page);
> +       else
> +               bio->bi_context = 0;
> +
>        length = first_hole << blkbits;
>        if (bio_add_page(bio, page, length, 0) < length) {
>                bio = mpage_bio_submit(READ, bio);
> @@ -581,6 +587,12 @@ alloc_new:
>                        goto confused;
>        }
>
> +       if (page && page->mapping && page->mapping->a_ops &&
> +               page->mapping->a_ops->get_context)
> +               bio->bi_context = page->mapping->a_ops->get_context(page);
> +       else
> +               bio->bi_context = 0;
> +
>        /*
>         * Must try to add the page before marking the buffer clean or
>         * the confused fail path above (OOM) will be very confused when
> diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
> index 4053cbd..f3ac448 100644
> --- a/include/linux/blk_types.h
> +++ b/include/linux/blk_types.h
> @@ -42,6 +42,7 @@ struct bio {
>
>        unsigned short          bi_vcnt;        /* how many bio_vec's */
>        unsigned short          bi_idx;         /* current index into bvl_vec */
> +       unsigned long           bi_context;     /* context of this bio */
>
>        /* Number of segments in this BIO after
>         * physical address coalescing is performed.
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index 2aa2466..0dd9a08 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -167,6 +167,7 @@ struct request {
>        struct list_head timeout_list;
>        unsigned int timeout;
>        int retries;
> +       unsigned long context;  /* context of this request */
>
>        /*
>         * completion callback.
> diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
> index 13bba17..0776564 100644
> --- a/include/linux/buffer_head.h
> +++ b/include/linux/buffer_head.h
> @@ -72,6 +72,8 @@ struct buffer_head {
>        struct list_head b_assoc_buffers; /* associated with another mapping */
>        struct address_space *b_assoc_map;      /* mapping this buffer is
>                                                   associated with */
> +       unsigned long   b_context; /* context for this buffer within the
> +                                                       storage device */
>        atomic_t b_count;               /* users using this buffer_head */
>  };
>
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 8de6755..4b379d8 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -626,6 +626,7 @@ struct address_space_operations {
>        int (*is_partially_uptodate) (struct page *, read_descriptor_t *,
>                                        unsigned long);
>        int (*error_remove_page)(struct address_space *, struct page *);
> +       int (*get_context)(struct page *);
>  };
>
>  extern const struct address_space_operations empty_aops;
> --
> 1.7.4.3
>
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux