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>
This commit is contained in:
parent
8ef9b0b9e1
commit
fbe77c30e9
|
@ -4610,7 +4610,7 @@ static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task,
|
||||||
return 0;
|
return 0;
|
||||||
if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context,
|
if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context,
|
||||||
hdr->args.lock_context,
|
hdr->args.lock_context,
|
||||||
hdr->rw_ops->rw_mode) == -EIO)
|
hdr->rw_mode) == -EIO)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
if (unlikely(test_bit(NFS_CONTEXT_BAD, &hdr->args.context->flags)))
|
if (unlikely(test_bit(NFS_CONTEXT_BAD, &hdr->args.context->flags)))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
|
@ -664,11 +664,11 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
|
||||||
const struct nfs_pgio_completion_ops *compl_ops,
|
const struct nfs_pgio_completion_ops *compl_ops,
|
||||||
const struct nfs_rw_ops *rw_ops,
|
const struct nfs_rw_ops *rw_ops,
|
||||||
size_t bsize,
|
size_t bsize,
|
||||||
int io_flags)
|
int io_flags,
|
||||||
|
gfp_t gfp_flags)
|
||||||
{
|
{
|
||||||
struct nfs_pgio_mirror *new;
|
struct nfs_pgio_mirror *new;
|
||||||
int i;
|
int i;
|
||||||
gfp_t gfp_flags = GFP_KERNEL;
|
|
||||||
|
|
||||||
desc->pg_moreio = 0;
|
desc->pg_moreio = 0;
|
||||||
desc->pg_inode = inode;
|
desc->pg_inode = inode;
|
||||||
|
@ -688,8 +688,6 @@ void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
|
||||||
if (pg_ops->pg_get_mirror_count) {
|
if (pg_ops->pg_get_mirror_count) {
|
||||||
/* until we have a request, we don't have an lseg and no
|
/* until we have a request, we don't have an lseg and no
|
||||||
* idea how many mirrors there will be */
|
* 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,
|
new = kcalloc(NFS_PAGEIO_DESCRIPTOR_MIRROR_MAX,
|
||||||
sizeof(struct nfs_pgio_mirror), gfp_flags);
|
sizeof(struct nfs_pgio_mirror), gfp_flags);
|
||||||
desc->pg_mirrors_dynamic = new;
|
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))
|
if (pagecount <= ARRAY_SIZE(pg_array->page_array))
|
||||||
pg_array->pagevec = pg_array->page_array;
|
pg_array->pagevec = pg_array->page_array;
|
||||||
else {
|
else {
|
||||||
if (desc->pg_rw_ops->rw_mode == FMODE_WRITE)
|
if (hdr->rw_mode == FMODE_WRITE)
|
||||||
gfp_flags = GFP_NOIO;
|
gfp_flags = GFP_NOIO;
|
||||||
pg_array->pagevec = kcalloc(pagecount, sizeof(struct page *), gfp_flags);
|
pg_array->pagevec = kcalloc(pagecount, sizeof(struct page *), gfp_flags);
|
||||||
if (!pg_array->pagevec) {
|
if (!pg_array->pagevec) {
|
||||||
|
|
|
@ -35,7 +35,11 @@ static struct kmem_cache *nfs_rdata_cachep;
|
||||||
|
|
||||||
static struct nfs_pgio_header *nfs_readhdr_alloc(void)
|
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)
|
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;
|
pg_ops = server->pnfs_curr_ld->pg_read_ops;
|
||||||
#endif
|
#endif
|
||||||
nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_read_ops,
|
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);
|
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 = {
|
static const struct nfs_rw_ops nfs_rw_read_ops = {
|
||||||
.rw_mode = FMODE_READ,
|
|
||||||
.rw_alloc_header = nfs_readhdr_alloc,
|
.rw_alloc_header = nfs_readhdr_alloc,
|
||||||
.rw_free_header = nfs_readhdr_free,
|
.rw_free_header = nfs_readhdr_free,
|
||||||
.rw_done = nfs_readpage_done,
|
.rw_done = nfs_readpage_done,
|
||||||
|
|
|
@ -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);
|
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;
|
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;
|
pg_ops = server->pnfs_curr_ld->pg_write_ops;
|
||||||
#endif
|
#endif
|
||||||
nfs_pageio_init(pgio, inode, pg_ops, compl_ops, &nfs_rw_write_ops,
|
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);
|
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 = {
|
static const struct nfs_rw_ops nfs_rw_write_ops = {
|
||||||
.rw_mode = FMODE_WRITE,
|
|
||||||
.rw_alloc_header = nfs_writehdr_alloc,
|
.rw_alloc_header = nfs_writehdr_alloc,
|
||||||
.rw_free_header = nfs_writehdr_free,
|
.rw_free_header = nfs_writehdr_free,
|
||||||
.rw_done = nfs_writeback_done,
|
.rw_done = nfs_writeback_done,
|
||||||
|
|
|
@ -64,7 +64,6 @@ struct nfs_pageio_ops {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nfs_rw_ops {
|
struct nfs_rw_ops {
|
||||||
const fmode_t rw_mode;
|
|
||||||
struct nfs_pgio_header *(*rw_alloc_header)(void);
|
struct nfs_pgio_header *(*rw_alloc_header)(void);
|
||||||
void (*rw_free_header)(struct nfs_pgio_header *);
|
void (*rw_free_header)(struct nfs_pgio_header *);
|
||||||
int (*rw_done)(struct rpc_task *, 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_pgio_completion_ops *compl_ops,
|
||||||
const struct nfs_rw_ops *rw_ops,
|
const struct nfs_rw_ops *rw_ops,
|
||||||
size_t bsize,
|
size_t bsize,
|
||||||
int how);
|
int how,
|
||||||
|
gfp_t gfp_flags);
|
||||||
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
|
extern int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
|
||||||
struct nfs_page *);
|
struct nfs_page *);
|
||||||
extern int nfs_pageio_resend(struct nfs_pageio_descriptor *,
|
extern int nfs_pageio_resend(struct nfs_pageio_descriptor *,
|
||||||
|
|
|
@ -1427,6 +1427,7 @@ struct nfs_pgio_header {
|
||||||
struct list_head pages;
|
struct list_head pages;
|
||||||
struct nfs_page *req;
|
struct nfs_page *req;
|
||||||
struct nfs_writeverf verf; /* Used for writes */
|
struct nfs_writeverf verf; /* Used for writes */
|
||||||
|
fmode_t rw_mode;
|
||||||
struct pnfs_layout_segment *lseg;
|
struct pnfs_layout_segment *lseg;
|
||||||
loff_t io_start;
|
loff_t io_start;
|
||||||
const struct rpc_call_ops *mds_ops;
|
const struct rpc_call_ops *mds_ops;
|
||||||
|
|
Loading…
Reference in New Issue