Skip to content

Commit fbe77c3

Browse files
bcodding-rhtrondmypd
authored andcommitted
NFS: move rw_mode to nfs_pageio_header
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>
1 parent 8ef9b0b commit fbe77c3

File tree

6 files changed

+18
-14
lines changed

6 files changed

+18
-14
lines changed

fs/nfs/nfs4proc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4610,7 +4610,7 @@ static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task,
46104610
return 0;
46114611
if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context,
46124612
hdr->args.lock_context,
4613-
hdr->rw_ops->rw_mode) == -EIO)
4613+
hdr->rw_mode) == -EIO)
46144614
return -EIO;
46154615
if (unlikely(test_bit(NFS_CONTEXT_BAD, &hdr->args.context->flags)))
46164616
return -EIO;

fs/nfs/pagelist.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -664,11 +664,11 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
664664
const struct nfs_pgio_completion_ops *compl_ops,
665665
const struct nfs_rw_ops *rw_ops,
666666
size_t bsize,
667-
int io_flags)
667+
int io_flags,
668+
gfp_t gfp_flags)
668669
{
669670
struct nfs_pgio_mirror *new;
670671
int i;
671-
gfp_t gfp_flags = GFP_KERNEL;
672672

673673
desc->pg_moreio = 0;
674674
desc->pg_inode = inode;
@@ -688,8 +688,6 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
688688
if (pg_ops->pg_get_mirror_count) {
689689
/* until we have a request, we don't have an lseg and no
690690
* idea how many mirrors there will be */
691-
if (desc->pg_rw_ops->rw_mode == FMODE_WRITE)
692-
gfp_flags = GFP_NOIO;
693691
new = kcalloc(NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX,
694692
sizeof(struct nfs_pgio_mirror), gfp_flags);
695693
desc->pg_mirrors_dynamic = new;
@@ -753,7 +751,7 @@ int nfs_generic_pgio(struct nfs_pageio_descriptor *desc,
753751
if (pagecount <= ARRAY_SIZE(pg_array->page_array))
754752
pg_array->pagevec = pg_array->page_array;
755753
else {
756-
if (desc->pg_rw_ops->rw_mode == FMODE_WRITE)
754+
if (hdr->rw_mode == FMODE_WRITE)
757755
gfp_flags = GFP_NOIO;
758756
pg_array->pagevec = kcalloc(pagecount, sizeof(struct page *), gfp_flags);
759757
if (!pg_array->pagevec) {

fs/nfs/read.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ static struct kmem_cache *nfs_rdata_cachep;
3535

3636
static struct nfs_pgio_header *nfs_readhdr_alloc(void)
3737
{
38-
return kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
38+
struct nfs_pgio_header *p = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
39+
40+
if (p)
41+
p->rw_mode = FMODE_READ;
42+
return p;
3943
}
4044

4145
static void nfs_readhdr_free(struct nfs_pgio_header *rhdr)
@@ -64,7 +68,7 @@ void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
6468
pg_ops = server->pnfs_curr_ld->pg_read_ops;
6569
#endif
6670
nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_read_ops,
67-
server->rsize, 0);
71+
server->rsize, 0, GFP_KERNEL);
6872
}
6973
EXPORT_SYMBOL_GPL(nfs_pageio_init_read);
7074

@@ -451,7 +455,6 @@ void nfs_destroy_readpagecache(void)
451455
}
452456

453457
static const struct nfs_rw_ops nfs_rw_read_ops = {
454-
.rw_mode = FMODE_READ,
455458
.rw_alloc_header = nfs_readhdr_alloc,
456459
.rw_free_header = nfs_readhdr_free,
457460
.rw_done = nfs_readpage_done,

fs/nfs/write.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,10 @@ static struct nfs_pgio_header *nfs_writehdr_alloc(void)
9696
{
9797
struct nfs_pgio_header *p = mempool_alloc(nfs_wdata_mempool, GFP_NOIO);
9898

99-
memset(p, 0, sizeof(*p));
99+
if (p) {
100+
memset(p, 0, sizeof(*p));
101+
p->rw_mode = FMODE_WRITE;
102+
}
100103
return p;
101104
}
102105

@@ -1381,7 +1384,7 @@ void nfs_pageio_init_write(struct nfs_pageio_descriptor *pgio,
13811384
pg_ops = server->pnfs_curr_ld->pg_write_ops;
13821385
#endif
13831386
nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_write_ops,
1384-
server->wsize, ioflags);
1387+
server->wsize, ioflags, GFP_NOIO);
13851388
}
13861389
EXPORT_SYMBOL_GPL(nfs_pageio_init_write);
13871390

@@ -2115,7 +2118,6 @@ void nfs_destroy_writepagecache(void)
21152118
}
21162119

21172120
static const struct nfs_rw_ops nfs_rw_write_ops = {
2118-
.rw_mode = FMODE_WRITE,
21192121
.rw_alloc_header = nfs_writehdr_alloc,
21202122
.rw_free_header = nfs_writehdr_free,
21212123
.rw_done = nfs_writeback_done,

include/linux/nfs_page.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ struct nfs_pageio_ops {
6464
};
6565

6666
struct nfs_rw_ops {
67-
const fmode_t rw_mode;
6867
struct nfs_pgio_header *(*rw_alloc_header)(void);
6968
void (*rw_free_header)(struct nfs_pgio_header *);
7069
int (*rw_done)(struct rpc_task *, struct nfs_pgio_header *,
@@ -124,7 +123,8 @@ extern void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
124123
const struct nfs_pgio_completion_ops *compl_ops,
125124
const struct nfs_rw_ops *rw_ops,
126125
size_t bsize,
127-
int how);
126+
int how,
127+
gfp_t gfp_flags);
128128
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
129129
struct nfs_page *);
130130
extern int nfs_pageio_resend(struct nfs_pageio_descriptor *,

include/linux/nfs_xdr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,6 +1427,7 @@ struct nfs_pgio_header {
14271427
struct list_head pages;
14281428
struct nfs_page *req;
14291429
struct nfs_writeverf verf; /* Used for writes */
1430+
fmode_t rw_mode;
14301431
struct pnfs_layout_segment *lseg;
14311432
loff_t io_start;
14321433
const struct rpc_call_ops *mds_ops;

0 commit comments

Comments
 (0)