NFS: move rw_mode to nfs_pageio_header
authorBenjamin Coddington <bcodding@redhat.com>
Wed, 19 Apr 2017 14:11:35 +0000 (10:11 -0400)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 20 Apr 2017 18:00:41 +0000 (14:00 -0400)
Let's try to have it in a cacheline in nfs4_proc_pgio_rpc_prepare().

Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4proc.c
fs/nfs/pagelist.c
fs/nfs/read.c
fs/nfs/write.c
include/linux/nfs_page.h
include/linux/nfs_xdr.h

index dda19a35ad9e70465a6e8916271796ab4ede7628..4e52ac773d1f531d2b2128db3a554968c5f1a6d6 100644 (file)
@@ -4610,7 +4610,7 @@ static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task,
                return 0;
        if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context,
                                hdr->args.lock_context,
-                               hdr->rw_ops->rw_mode) == -EIO)
+                               hdr->rw_mode) == -EIO)
                return -EIO;
        if (unlikely(test_bit(NFS_CONTEXT_BAD, &hdr->args.context->flags)))
                return -EIO;
index 453255c30fa1c0fa28e139bbc23578709f5f3061..f53610672f032f1825f5a1716602847bba06613d 100644 (file)
@@ -664,11 +664,11 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
                     const struct nfs_pgio_completion_ops *compl_ops,
                     const struct nfs_rw_ops *rw_ops,
                     size_t bsize,
-                    int io_flags)
+                    int io_flags,
+                    gfp_t gfp_flags)
 {
        struct nfs_pgio_mirror *new;
        int i;
-       gfp_t gfp_flags = GFP_KERNEL;
 
        desc->pg_moreio = 0;
        desc->pg_inode = inode;
@@ -688,8 +688,6 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
        if (pg_ops->pg_get_mirror_count) {
                /* until we have a request, we don't have an lseg and no
                 * idea how many mirrors there will be */
-               if (desc->pg_rw_ops->rw_mode == FMODE_WRITE)
-                       gfp_flags = GFP_NOIO;
                new = kcalloc(NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX,
                              sizeof(struct nfs_pgio_mirror), gfp_flags);
                desc->pg_mirrors_dynamic = new;
@@ -753,7 +751,7 @@ int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
        if (pagecount <= ARRAY_SIZE(pg_array->page_array))
                pg_array->pagevec = pg_array->page_array;
        else {
-               if (desc->pg_rw_ops->rw_mode == FMODE_WRITE)
+               if (hdr->rw_mode == FMODE_WRITE)
                        gfp_flags = GFP_NOIO;
                pg_array->pagevec = kcalloc(pagecount, sizeof(struct page *), gfp_flags);
                if (!pg_array->pagevec) {
index defc9233e9858c43a9438b2cf918a899b7f56afa..a8421d9dab6a125c4eb6b7ad9f074d8ce91a5a99 100644 (file)
@@ -35,7 +35,11 @@ static struct kmem_cache *nfs_rdata_cachep;
 
 static struct nfs_pgio_header *nfs_readhdr_alloc(void)
 {
-       return kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
+       struct nfs_pgio_header *p = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
+
+       if (p)
+               p->rw_mode = FMODE_READ;
+       return p;
 }
 
 static void nfs_readhdr_free(struct nfs_pgio_header *rhdr)
@@ -64,7 +68,7 @@ void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
                pg_ops = server->pnfs_curr_ld->pg_read_ops;
 #endif
        nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_read_ops,
-                       server->rsize, 0);
+                       server->rsize, 0, GFP_KERNEL);
 }
 EXPORT_SYMBOL_GPL(nfs_pageio_init_read);
 
@@ -451,7 +455,6 @@ void nfs_destroy_readpagecache(void)
 }
 
 static const struct nfs_rw_ops nfs_rw_read_ops = {
-       .rw_mode                = FMODE_READ,
        .rw_alloc_header        = nfs_readhdr_alloc,
        .rw_free_header         = nfs_readhdr_free,
        .rw_done                = nfs_readpage_done,
index e0bccbefbc9ea21605dd922c4648ffd1a809ed68..95ac001b6fdfe9561f8b8a2a7fcc261a3b9be04b 100644 (file)
@@ -96,7 +96,10 @@ static struct nfs_pgio_header *nfs_writehdr_alloc(void)
 {
        struct nfs_pgio_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
 
-       memset(p, 0, sizeof(*p));
+       if (p) {
+               memset(p, 0, sizeof(*p));
+               p->rw_mode = FMODE_WRITE;
+       }
        return p;
 }
 
@@ -1381,7 +1384,7 @@ void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
                pg_ops = server->pnfs_curr_ld->pg_write_ops;
 #endif
        nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_write_ops,
-                       server->wsize, ioflags);
+                       server->wsize, ioflags, GFP_NOIO);
 }
 EXPORT_SYMBOL_GPL(nfs_pageio_init_write);
 
@@ -2115,7 +2118,6 @@ void nfs_destroy_writepagecache(void)
 }
 
 static const struct nfs_rw_ops nfs_rw_write_ops = {
-       .rw_mode                = FMODE_WRITE,
        .rw_alloc_header        = nfs_writehdr_alloc,
        .rw_free_header         = nfs_writehdr_free,
        .rw_done                = nfs_writeback_done,
index 957049f72290d4b6c328845535c664aea4afc7c0..6f01e28bba27fe76a156dc5156ea3a9dd2e3cd80 100644 (file)
@@ -64,7 +64,6 @@ struct nfs_pageio_ops {
 };
 
 struct nfs_rw_ops {
-       const fmode_t rw_mode;
        struct nfs_pgio_header *(*rw_alloc_header)(void);
        void (*rw_free_header)(struct nfs_pgio_header *);
        int  (*rw_done)(struct rpc_task *, struct nfs_pgio_header *,
@@ -124,7 +123,8 @@ extern      void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
                             const struct nfs_pgio_completion_ops *compl_ops,
                             const struct nfs_rw_ops *rw_ops,
                             size_t bsize,
-                            int how);
+                            int how,
+                            gfp_t gfp_flags);
 extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
                                   struct nfs_page *);
 extern  int nfs_pageio_resend(struct nfs_pageio_descriptor *,
index 348f7c158084b8de71c2a0a2f6941b0db7bf2c3b..51e27f9746eee922ba09aaf30b366d5a72e5899a 100644 (file)
@@ -1427,6 +1427,7 @@ struct nfs_pgio_header {
        struct list_head        pages;
        struct nfs_page         *req;
        struct nfs_writeverf    verf;           /* Used for writes */
+       fmode_t                 rw_mode;
        struct pnfs_layout_segment *lseg;
        loff_t                  io_start;
        const struct rpc_call_ops *mds_ops;