* [PATCH 0/30] NFSv4.1 Server DRC rewrite Version 3
@ 2009-06-08 18:20 andros
2009-06-08 18:20 ` [PATCH 01/30] nfsd41: create_session check replay first andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs
NFSv4.1 Server DRC rewrite Version 3
This patch set applies to 2.6.30-rc8 and is the third version of the NFSv4.1
server DRC rewrite. As per Bruce Field's suggestion, the clientid cache for
CREATE_SESSION operations has been changed from storing the encoded response
to storing struct nfsd4_create_session, the CREATE_SESSION xdr structure.
The NFSv4.1 DRC is changed from a page based cache to
a buffer based cache. The logic for the single slot clientid cache has been
separated from the session slot logic to handle the CREATE_SESSION call
preceeded by a SEQUENCE and all the replay combinations therein.
The session DRC now caches encoded operations with the exception of the
SEQUENCE operation which for a replay is encoded with the current slot and
session values. A review of message sizes indicates that a 512 byte buffer
for the operations is adequate.
Not addressed is replacing the nfsd4_check_drc_limit() post-operation checking
with a pre-operation processing estimate of the encoded per operation result.
Testing:
4.1 mount: Connectathon and 4.1pynfs including the new create session replay
tests.
4.0 mount; Connectathon.
Clientid (create session operation) single slot DRC patches
0001-nfsd41-create_session-check-replay-first.patch
0002-nfsd41-change-check_slot_seqid-parameters.patch
0003-nfsd41-declare-clientid-create-session-slot-structu.patch
0004-nfsd41-encode-create_session-result-into-clid-cache.patch
0005-nfsd41-replay-solo-and-embedded-create-session.patch
0006-nfsd41-remove-the-unused-nfsd4_slot-create-session-s.patch
Sessions (sequence operation) multiple slot DRC patches.
0007-nfsd41-sanity-check-client-drc-maxreqs.patch
0008-nfsd41-change-from-page-to-memory-based-drc-limits.patch
0009-nfsd41-use-globals-for-DRC-memory-use-management.patch
0010-nfsd41-set-the-session-maximum-response-size-cached.patch
0011-nfsd41-use-static-buffers-for-sessions-DRC.patch
0012-nfsd41-replace-ce_cachethis-with-nfsd4_slot-field.patch
0013-nfsd41-replace-ce_opcnt-with-nfsd4_slot-field.patch
0014-nfsd41-nfsd41-replace-ce_status-with-nfsd4_slot-fi.patch
0015-nfsd41-obliterate-nfsd4_copy_pages.patch
0016-nfsd41-obliterate-nfsd41_copy_replay_data.patch
0017-nfsd41-obliterate-nfsd4_release_respages.patch
0018-nfsd41-remove-iovlen-field-from-nfsd4_compound_stat.patch
0019-nfsd41-remove-struct-nfsd4_cache_entry.patch
0020-nfsd41-obliterate-nfsd4_set_statp.patch
0021-nfsd41-rename-nfsd4_enc_uncached_replay.patch
0022-nfsd41-encode-replay-sequence-from-the-slot-values.patch
0023-nfsd41-fix-nfsd4_replay_cache_entry-comments.patch
0024-nfsd41-fix-nfsd4_store_cache_entry-comments.patch
0025-nfsd41-support-16-slots-per-session.patch
0026-nfsd41-use-the-maximum-operations-per-compound-in-n.patch
0027-nfsd41-fix-nfsd4_store_cache_entry-dprintk.patch
0028-nfsd41-add-test-for-failed-sequence-operation.patch
0029-nfsd41-remove-redundant-failed-sequence-check.patch
0030-nfsd41-only-reference-the-session-on-non-replay-seq.patch
patch-message.txt
Comments welcome.
-->Andy
^ permalink raw reply [flat|nested] 31+ messages in thread
* [PATCH 01/30] nfsd41: create_session check replay first
2009-06-08 18:20 [PATCH 0/30] NFSv4.1 Server DRC rewrite Version 3 andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 02/30] nfsd41: change check_slot_seqid parameters andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Replay processing needs to preceed other error processing.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 3b711f5..e26e2b7 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1369,12 +1369,6 @@ nfsd4_create_session(struct svc_rqst *rqstp,
}
conf->cl_slot.sl_seqid++;
} else if (unconf) {
- if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
- (ip_addr != unconf->cl_addr)) {
- status = nfserr_clid_inuse;
- goto out;
- }
-
slot = &unconf->cl_slot;
status = check_slot_seqid(cr_ses->seqid, slot);
if (status) {
@@ -1383,6 +1377,12 @@ nfsd4_create_session(struct svc_rqst *rqstp,
goto out;
}
+ if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
+ (ip_addr != unconf->cl_addr)) {
+ status = nfserr_clid_inuse;
+ goto out;
+ }
+
slot->sl_seqid++; /* from 0 to 1 */
move_to_confirmed(unconf);
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 02/30] nfsd41: change check_slot_seqid parameters
2009-06-08 18:20 ` [PATCH 01/30] nfsd41: create_session check replay first andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 03/30] nfsd41: declare clientid create session slot structure andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
For separation of session slot and clientid slot processing.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 24 +++++++++++++-----------
1 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index e26e2b7..8bf1cfa 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1309,26 +1309,26 @@ error:
}
static int
-check_slot_seqid(u32 seqid, struct nfsd4_slot *slot)
+check_slot_seqid(u32 seqid, u32 slot_seqid, int slot_inuse)
{
- dprintk("%s enter. seqid %d slot->sl_seqid %d\n", __func__, seqid,
- slot->sl_seqid);
+ dprintk("%s enter. seqid %d slot_seqid %d\n", __func__, seqid,
+ slot_seqid);
/* The slot is in use, and no response has been sent. */
- if (slot->sl_inuse) {
- if (seqid == slot->sl_seqid)
+ if (slot_inuse) {
+ if (seqid == slot_seqid)
return nfserr_jukebox;
else
return nfserr_seq_misordered;
}
/* Normal */
- if (likely(seqid == slot->sl_seqid + 1))
+ if (likely(seqid == slot_seqid + 1))
return nfs_ok;
/* Replay */
- if (seqid == slot->sl_seqid)
+ if (seqid == slot_seqid)
return nfserr_replay_cache;
/* Wraparound */
- if (seqid == 1 && (slot->sl_seqid + 1) == 0)
+ if (seqid == 1 && (slot_seqid + 1) == 0)
return nfs_ok;
/* Misordered replay or misordered new request */
return nfserr_seq_misordered;
@@ -1351,7 +1351,8 @@ nfsd4_create_session(struct svc_rqst *rqstp,
if (conf) {
slot = &conf->cl_slot;
- status = check_slot_seqid(cr_ses->seqid, slot);
+ status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid,
+ slot->sl_inuse);
if (status == nfserr_replay_cache) {
dprintk("Got a create_session replay! seqid= %d\n",
slot->sl_seqid);
@@ -1370,7 +1371,8 @@ nfsd4_create_session(struct svc_rqst *rqstp,
conf->cl_slot.sl_seqid++;
} else if (unconf) {
slot = &unconf->cl_slot;
- status = check_slot_seqid(cr_ses->seqid, slot);
+ status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid,
+ slot->sl_inuse);
if (status) {
/* an unconfirmed replay returns misordered */
status = nfserr_seq_misordered;
@@ -1477,7 +1479,7 @@ nfsd4_sequence(struct svc_rqst *rqstp,
slot = &session->se_slots[seq->slotid];
dprintk("%s: slotid %d\n", __func__, seq->slotid);
- status = check_slot_seqid(seq->seqid, slot);
+ status = check_slot_seqid(seq->seqid, slot->sl_seqid, slot->sl_inuse);
if (status == nfserr_replay_cache) {
cstate->slot = slot;
cstate->session = session;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 03/30] nfsd41: declare clientid create session slot structure
2009-06-08 18:20 ` [PATCH 02/30] nfsd41: change check_slot_seqid parameters andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 04/30] nfsd41: encode create_session result into clid cache andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
The nfs41 single slot clientid cache holds the results of create session
processing in the create session xdr struct. The slot does not need the inuse,
cachethis or other fields that the multiple slot session cache uses.
The cl_slot field of struct nfs4_client will be removed in a following patch.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
include/linux/nfsd/state.h | 31 +++++++++++++++++++++++++++++++
include/linux/nfsd/xdr4.h | 23 -----------------------
2 files changed, 31 insertions(+), 23 deletions(-)
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 4d61c87..901590e 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -122,6 +122,36 @@ struct nfsd4_slot {
struct nfsd4_cache_entry sl_cache_entry;
};
+struct nfsd4_channel_attrs {
+ u32 headerpadsz;
+ u32 maxreq_sz;
+ u32 maxresp_sz;
+ u32 maxresp_cached;
+ u32 maxops;
+ u32 maxreqs;
+ u32 nr_rdma_attrs;
+ u32 rdma_attrs;
+};
+
+struct nfsd4_create_session {
+ clientid_t clientid;
+ struct nfs4_sessionid sessionid;
+ u32 seqid;
+ u32 flags;
+ struct nfsd4_channel_attrs fore_channel;
+ struct nfsd4_channel_attrs back_channel;
+ u32 callback_prog;
+ u32 uid;
+ u32 gid;
+};
+
+/* The single slot clientid cache structure */
+struct nfsd4_clid_slot {
+ u32 sl_seqid;
+ __be32 sl_status;
+ struct nfsd4_create_session sl_cr_ses;
+};
+
struct nfsd4_session {
struct kref se_ref;
struct list_head se_hash; /* hash by sessionid */
@@ -192,6 +222,7 @@ struct nfs4_client {
/* for nfs41 */
struct list_head cl_sessions;
struct nfsd4_slot cl_slot; /* create_session slot */
+ struct nfsd4_clid_slot cl_cs_slot; /* create_session slot */
u32 cl_exchange_flags;
struct nfs4_sessionid cl_sessionid;
};
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
index f80d601..6e24dbb 100644
--- a/include/linux/nfsd/xdr4.h
+++ b/include/linux/nfsd/xdr4.h
@@ -363,29 +363,6 @@ struct nfsd4_exchange_id {
int spa_how;
};
-struct nfsd4_channel_attrs {
- u32 headerpadsz;
- u32 maxreq_sz;
- u32 maxresp_sz;
- u32 maxresp_cached;
- u32 maxops;
- u32 maxreqs;
- u32 nr_rdma_attrs;
- u32 rdma_attrs;
-};
-
-struct nfsd4_create_session {
- clientid_t clientid;
- struct nfs4_sessionid sessionid;
- u32 seqid;
- u32 flags;
- struct nfsd4_channel_attrs fore_channel;
- struct nfsd4_channel_attrs back_channel;
- u32 callback_prog;
- u32 uid;
- u32 gid;
-};
-
struct nfsd4_sequence {
struct nfs4_sessionid sessionid; /* request/response */
u32 seqid; /* request/response */
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 04/30] nfsd41: encode create_session result into clid cache
2009-06-08 18:20 ` [PATCH 03/30] nfsd41: declare clientid create session slot structure andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 05/30] nfsd41: replay solo and embedded create session andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
CREATE_SESSION can be preceeded by a SEQUENCE operation and the
create session single slot cache must be maintained. Save the results of
a create session call (struct nfsd4_create_session) into the cache at the end
of processing while still under the state lock.
If the CREATE_SESSION operation it is preceeded by a SEQUENCE operation it
will also be encoded into the session slot table cache.
Errors that do not change the create session cache:
A create session NFS4ERR_STALE_CLIENTID error means that a client record
(and associated create session slot) could not be found and therefore can't
be changed. NFSERR_SEQ_MISORDERED errors do not change the slot cache.
All other errors get cached.
The old method of using nfsd4_store_cache_entry() for create sessions operations
will be removed in a following patch.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 22 +++++++++++++++++++++-
1 files changed, 21 insertions(+), 1 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 8bf1cfa..265379e 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1334,6 +1334,20 @@ check_slot_seqid(u32 seqid, u32 slot_seqid, int slot_inuse)
return nfserr_seq_misordered;
}
+/*
+ * Cache the create session result into the create session single DRC
+ * slot cache by saving the xdr structure. sl_seqid has been set.
+ * Do this for solo or embedded create session operations.
+ */
+static void
+nfsd4_cache_create_session(struct nfsd4_create_session *cr_ses,
+ struct nfsd4_clid_slot *slot, int nfserr)
+{
+ slot->sl_status = nfserr;
+ memcpy(&slot->sl_cr_ses, cr_ses, sizeof(*cr_ses));
+}
+
+
__be32
nfsd4_create_session(struct svc_rqst *rqstp,
struct nfsd4_compound_state *cstate,
@@ -1343,6 +1357,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
struct nfsd4_compoundres *resp = rqstp->rq_resp;
struct nfs4_client *conf, *unconf;
struct nfsd4_slot *slot = NULL;
+ struct nfsd4_clid_slot *cs_slot = NULL;
int status = 0;
nfs4_lock_state();
@@ -1371,6 +1386,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
conf->cl_slot.sl_seqid++;
} else if (unconf) {
slot = &unconf->cl_slot;
+ cs_slot = &unconf->cl_cs_slot;
status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid,
slot->sl_inuse);
if (status) {
@@ -1382,7 +1398,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
(ip_addr != unconf->cl_addr)) {
status = nfserr_clid_inuse;
- goto out;
+ goto out_cache;
}
slot->sl_seqid++; /* from 0 to 1 */
@@ -1412,6 +1428,10 @@ nfsd4_create_session(struct svc_rqst *rqstp,
cstate->slot = slot;
/* Ensure a page is used for the cache */
slot->sl_cache_entry.ce_cachethis = 1;
+
+out_cache:
+ /* cache solo and embedded create sessions under the state lock */
+ nfsd4_cache_create_session(cr_ses, cs_slot, status);
out:
nfs4_unlock_state();
dprintk("%s returns %d\n", __func__, ntohl(status));
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 05/30] nfsd41: replay solo and embedded create session
2009-06-08 18:20 ` [PATCH 04/30] nfsd41: encode create_session result into clid cache andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 06/30] nfsd41 remove the unused nfsd4_slot create session slot andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
CREATE_SESSION can be preceeded by a SEQUENCE operation (an embedded
CREATE_SESSION) and the create session single slot cache must be maintained.
nfsd4_replay_cache_entry() and nfsd4_store_cache_entry() did not implement the
replay of an embedded CREATE_SESSION.
Replace the old create session struct nfs4_slot cache with the new
nfsd4_clid_slot cache which on replay replaces the current struct
nfs4_create_session with the cached version, allowing nfsd4_proc_compound
to handle both the solo and embedded CREATE_SESSION case for us via the
normal use of encode_operation.
Always replay a create session from nfsd4_replay_create_session(). Leave
nfsd4_store_cache_entry() for session (sequence operation) replays.
A following patch removes nfs4_client->cl_slot.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4proc.c | 2 +-
fs/nfsd/nfs4state.c | 39 +++++++++++++++++----------------------
2 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index b2883e9..13a6c58 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -996,7 +996,7 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,
BUG_ON(op->status == nfs_ok);
encode_op:
- /* Only from SEQUENCE or CREATE_SESSION */
+ /* Only from SEQUENCE */
if (resp->cstate.status == nfserr_replay_cache) {
dprintk("%s NFS4.1 replay from cache\n", __func__);
if (nfsd4_not_cached(resp))
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 265379e..5f2dd23 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1347,6 +1347,13 @@ nfsd4_cache_create_session(struct nfsd4_create_session *cr_ses,
memcpy(&slot->sl_cr_ses, cr_ses, sizeof(*cr_ses));
}
+static __be32
+nfsd4_replay_create_session(struct nfsd4_create_session *cr_ses,
+ struct nfsd4_clid_slot *slot)
+{
+ memcpy(cr_ses, &slot->sl_cr_ses, sizeof(*cr_ses));
+ return slot->sl_status;
+}
__be32
nfsd4_create_session(struct svc_rqst *rqstp,
@@ -1354,9 +1361,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
struct nfsd4_create_session *cr_ses)
{
u32 ip_addr = svc_addr_in(rqstp)->sin_addr.s_addr;
- struct nfsd4_compoundres *resp = rqstp->rq_resp;
struct nfs4_client *conf, *unconf;
- struct nfsd4_slot *slot = NULL;
struct nfsd4_clid_slot *cs_slot = NULL;
int status = 0;
@@ -1365,30 +1370,25 @@ nfsd4_create_session(struct svc_rqst *rqstp,
conf = find_confirmed_client(&cr_ses->clientid);
if (conf) {
- slot = &conf->cl_slot;
- status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid,
- slot->sl_inuse);
+ cs_slot = &conf->cl_cs_slot;
+ status = check_slot_seqid(cr_ses->seqid, cs_slot->sl_seqid, 0);
if (status == nfserr_replay_cache) {
dprintk("Got a create_session replay! seqid= %d\n",
- slot->sl_seqid);
- cstate->slot = slot;
- cstate->status = status;
+ cs_slot->sl_seqid);
/* Return the cached reply status */
- status = nfsd4_replay_cache_entry(resp, NULL);
+ status = nfsd4_replay_create_session(cr_ses, cs_slot);
goto out;
- } else if (cr_ses->seqid != conf->cl_slot.sl_seqid + 1) {
+ } else if (cr_ses->seqid != cs_slot->sl_seqid + 1) {
status = nfserr_seq_misordered;
dprintk("Sequence misordered!\n");
dprintk("Expected seqid= %d but got seqid= %d\n",
- slot->sl_seqid, cr_ses->seqid);
+ cs_slot->sl_seqid, cr_ses->seqid);
goto out;
}
- conf->cl_slot.sl_seqid++;
+ cs_slot->sl_seqid++;
} else if (unconf) {
- slot = &unconf->cl_slot;
cs_slot = &unconf->cl_cs_slot;
- status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid,
- slot->sl_inuse);
+ status = check_slot_seqid(cr_ses->seqid, cs_slot->sl_seqid, 0);
if (status) {
/* an unconfirmed replay returns misordered */
status = nfserr_seq_misordered;
@@ -1401,7 +1401,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
goto out_cache;
}
- slot->sl_seqid++; /* from 0 to 1 */
+ cs_slot->sl_seqid++; /* from 0 to 1 */
move_to_confirmed(unconf);
/*
@@ -1422,12 +1422,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
memcpy(cr_ses->sessionid.data, conf->cl_sessionid.data,
NFS4_MAX_SESSIONID_LEN);
- cr_ses->seqid = slot->sl_seqid;
-
- slot->sl_inuse = true;
- cstate->slot = slot;
- /* Ensure a page is used for the cache */
- slot->sl_cache_entry.ce_cachethis = 1;
+ cr_ses->seqid = cs_slot->sl_seqid;
out_cache:
/* cache solo and embedded create sessions under the state lock */
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 06/30] nfsd41 remove the unused nfsd4_slot create session slot
2009-06-08 18:20 ` [PATCH 05/30] nfsd41: replay solo and embedded create session andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 07/30] nfsd41: sanity check client drc maxreqs andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
The multiple slot sessions DRC and the single slot create session DRC no
longer share struct nfsd4_slot and associated struct nfsd4_cache_entry
helper routines. The logic in nfs4svc_encode_compoundres to switch between
the mulitple sessions DRC and the old single create session DRC will be
removed in a following patch.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 5 +----
include/linux/nfsd/state.h | 1 -
2 files changed, 1 insertions(+), 5 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 5f2dd23..f3acaa0 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -648,8 +648,6 @@ static inline void
free_client(struct nfs4_client *clp)
{
shutdown_callback_client(clp);
- nfsd4_release_respages(clp->cl_slot.sl_cache_entry.ce_respages,
- clp->cl_slot.sl_cache_entry.ce_resused);
if (clp->cl_cred.cr_group_info)
put_group_info(clp->cl_cred.cr_group_info);
kfree(clp->cl_principal);
@@ -1293,12 +1291,11 @@ out_copy:
exid->clientid.cl_boot = new->cl_clientid.cl_boot;
exid->clientid.cl_id = new->cl_clientid.cl_id;
- new->cl_slot.sl_seqid = 0;
exid->seqid = 1;
nfsd4_set_ex_flags(new, exid);
dprintk("nfsd4_exchange_id seqid %d flags %x\n",
- new->cl_slot.sl_seqid, new->cl_exchange_flags);
+ new->cl_cs_slot.sl_seqid, new->cl_exchange_flags);
status = nfs_ok;
out:
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 901590e..aeb5e82 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -221,7 +221,6 @@ struct nfs4_client {
/* for nfs41 */
struct list_head cl_sessions;
- struct nfsd4_slot cl_slot; /* create_session slot */
struct nfsd4_clid_slot cl_cs_slot; /* create_session slot */
u32 cl_exchange_flags;
struct nfs4_sessionid cl_sessionid;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 07/30] nfsd41: sanity check client drc maxreqs
2009-06-08 18:20 ` [PATCH 06/30] nfsd41 remove the unused nfsd4_slot create session slot andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 08/30] nfsd41: change from page to memory based drc limits andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Ensure the client requested maximum requests are between 1 and
NFSD_MAX_SLOTS_PER_SESSION
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index f3acaa0..3b05df3 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -427,6 +427,11 @@ static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
{
int status = 0, np = fchan->maxreqs * NFSD_PAGES_PER_SLOT;
+ if (fchan->maxreqs < 1)
+ return nfserr_inval;
+ else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
+ fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
+
spin_lock(&nfsd_serv->sv_lock);
if (np + nfsd_serv->sv_drc_pages_used > nfsd_serv->sv_drc_max_pages)
np = nfsd_serv->sv_drc_max_pages - nfsd_serv->sv_drc_pages_used;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 08/30] nfsd41: change from page to memory based drc limits
2009-06-08 18:20 ` [PATCH 07/30] nfsd41: sanity check client drc maxreqs andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 09/30] nfsd41: use globals for DRC memory use management andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
NFSD_SLOT_CACHE_SIZE is the size of all encoded operation responses (excluding
the sequence operation) that we want to cache.
Adjust NFSD_DRC_SIZE_SHIFT to reflect using 512 bytes instead of PAGE_SIZE.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 29 +++++++++++++++--------------
fs/nfsd/nfssvc.c | 13 +++++++------
include/linux/nfsd/state.h | 1 +
include/linux/sunrpc/svc.h | 4 ++--
4 files changed, 25 insertions(+), 22 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 3b05df3..52bd99c 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -418,33 +418,34 @@ gen_sessionid(struct nfsd4_session *ses)
* Give the client the number of slots it requests bound by
* NFSD_MAX_SLOTS_PER_SESSION and by sv_drc_max_pages.
*
- * If we run out of pages (sv_drc_pages_used == sv_drc_max_pages) we
- * should (up to a point) re-negotiate active sessions and reduce their
- * slot usage to make rooom for new connections. For now we just fail the
- * create session.
+ * If we run out of reserved DRC memory we should (up to a point) re-negotiate
+ * active sessions and reduce their slot usage to make rooom for new
+ * connections. For now we just fail the create session.
*/
static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
{
- int status = 0, np = fchan->maxreqs * NFSD_PAGES_PER_SLOT;
+ int mem;
if (fchan->maxreqs < 1)
return nfserr_inval;
else if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
+ mem = fchan->maxreqs * NFSD_SLOT_CACHE_SIZE;
+
spin_lock(&nfsd_serv->sv_lock);
- if (np + nfsd_serv->sv_drc_pages_used > nfsd_serv->sv_drc_max_pages)
- np = nfsd_serv->sv_drc_max_pages - nfsd_serv->sv_drc_pages_used;
- nfsd_serv->sv_drc_pages_used += np;
+ if (mem + nfsd_serv->sv_drc_mem_used > nfsd_serv->sv_drc_max_mem)
+ mem = nfsd_serv->sv_drc_max_mem - nfsd_serv->sv_drc_mem_used;
+ nfsd_serv->sv_drc_mem_used += mem;
spin_unlock(&nfsd_serv->sv_lock);
- if (np <= 0) {
- status = nfserr_resource;
+ if (mem < NFSD_SLOT_CACHE_SIZE) {
fchan->maxreqs = 0;
- } else
- fchan->maxreqs = np / NFSD_PAGES_PER_SLOT;
-
- return status;
+ return nfserr_resource;
+ } else {
+ fchan->maxreqs = mem / NFSD_SLOT_CACHE_SIZE;
+ return 0;
+ }
}
/*
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index cbba4a9..80588cc 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -237,12 +237,13 @@ void nfsd_reset_versions(void)
static void set_max_drc(void)
{
/* The percent of nr_free_buffer_pages used by the V4.1 server DRC */
- #define NFSD_DRC_SIZE_SHIFT 7
- nfsd_serv->sv_drc_max_pages = nr_free_buffer_pages()
- >> NFSD_DRC_SIZE_SHIFT;
- nfsd_serv->sv_drc_pages_used = 0;
- dprintk("%s svc_drc_max_pages %u\n", __func__,
- nfsd_serv->sv_drc_max_pages);
+ #define NFSD_DRC_SIZE_SHIFT 10
+ nfsd_serv->sv_drc_max_mem = (nr_free_buffer_pages()
+ >> NFSD_DRC_SIZE_SHIFT) * PAGE_SIZE;
+ nfsd_serv->sv_drc_mem_used = 0;
+ dprintk("%s svc_drc_max_mem %u [in pages %lu]\n", __func__,
+ nfsd_serv->sv_drc_max_mem,
+ nfsd_serv->sv_drc_max_mem / PAGE_SIZE);
}
int nfsd_create_serv(void)
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index aeb5e82..28ddb32 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -103,6 +103,7 @@ struct nfs4_callback {
#define NFSD_MAX_SLOTS_PER_SESSION 128
/* Maximum number of pages per slot cache entry */
#define NFSD_PAGES_PER_SLOT 1
+#define NFSD_SLOT_CACHE_SIZE 512
/* Maximum number of operations per session compound */
#define NFSD_MAX_OPS_PER_COMPOUND 16
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index 2a30775..243508e 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -94,8 +94,8 @@ struct svc_serv {
struct module * sv_module; /* optional module to count when
* adding threads */
svc_thread_fn sv_function; /* main function for threads */
- unsigned int sv_drc_max_pages; /* Total pages for DRC */
- unsigned int sv_drc_pages_used;/* DRC pages used */
+ unsigned int sv_drc_max_mem; /* Total pages for DRC */
+ unsigned int sv_drc_mem_used;/* DRC pages used */
};
/*
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 09/30] nfsd41: use globals for DRC memory use management
2009-06-08 18:20 ` [PATCH 08/30] nfsd41: change from page to memory based drc limits andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 10/30] nfsd41: set the session maximum response size cached andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
The version 4.1 DRC memory limit and tracking variables are server wide and
session specific.
Add a spinlock to serialize access to the management variables which change
on session creation and deletion (usage counter) or (future) administrative
action to adjust the total DRC memory limit.
Track DRC memory usage in free session.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 15 +++++++++------
fs/nfsd/nfssvc.c | 19 +++++++++++++++----
include/linux/nfsd/nfsd.h | 5 +++++
include/linux/sunrpc/svc.h | 2 --
4 files changed, 29 insertions(+), 12 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 52bd99c..db56a8a 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -416,7 +416,7 @@ gen_sessionid(struct nfsd4_session *ses)
/*
* Give the client the number of slots it requests bound by
- * NFSD_MAX_SLOTS_PER_SESSION and by sv_drc_max_pages.
+ * NFSD_MAX_SLOTS_PER_SESSION and by nfsd_drc_max_mem.
*
* If we run out of reserved DRC memory we should (up to a point) re-negotiate
* active sessions and reduce their slot usage to make rooom for new
@@ -433,11 +433,11 @@ static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
mem = fchan->maxreqs * NFSD_SLOT_CACHE_SIZE;
- spin_lock(&nfsd_serv->sv_lock);
- if (mem + nfsd_serv->sv_drc_mem_used > nfsd_serv->sv_drc_max_mem)
- mem = nfsd_serv->sv_drc_max_mem - nfsd_serv->sv_drc_mem_used;
- nfsd_serv->sv_drc_mem_used += mem;
- spin_unlock(&nfsd_serv->sv_lock);
+ spin_lock(&nfsd_drc_lock);
+ if (mem + nfsd_drc_mem_used > nfsd_drc_max_mem)
+ mem = nfsd_drc_max_mem - nfsd_drc_mem_used;
+ nfsd_drc_mem_used += mem;
+ spin_unlock(&nfsd_drc_lock);
if (mem < NFSD_SLOT_CACHE_SIZE) {
fchan->maxreqs = 0;
@@ -586,6 +586,9 @@ free_session(struct kref *kref)
struct nfsd4_cache_entry *e = &ses->se_slots[i].sl_cache_entry;
nfsd4_release_respages(e->ce_respages, e->ce_resused);
}
+ spin_lock(&nfsd_drc_lock);
+ nfsd_drc_mem_used -= ses->se_fnumslots * NFSD_SLOT_CACHE_SIZE;
+ spin_unlock(&nfsd_drc_lock);
kfree(ses);
}
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index 80588cc..37633f5 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -67,6 +67,16 @@ struct timeval nfssvc_boot;
DEFINE_MUTEX(nfsd_mutex);
struct svc_serv *nfsd_serv;
+/*
+ * nfsd_drc_lock protects nfsd_drc_max_pages and nfsd_drc_pages_used.
+ * nfsd_drc_max_pages limits the total amount of memory available for
+ * version 4.1 DRC caches.
+ * nfsd_drc_pages_used tracks the current version 4.1 DRC memory usage.
+ */
+spinlock_t nfsd_drc_lock;
+unsigned int nfsd_drc_max_mem;
+unsigned int nfsd_drc_mem_used;
+
#if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL)
static struct svc_stat nfsd_acl_svcstats;
static struct svc_version * nfsd_acl_version[] = {
@@ -238,12 +248,13 @@ static void set_max_drc(void)
{
/* The percent of nr_free_buffer_pages used by the V4.1 server DRC */
#define NFSD_DRC_SIZE_SHIFT 10
- nfsd_serv->sv_drc_max_mem = (nr_free_buffer_pages()
+ nfsd_drc_max_mem = (nr_free_buffer_pages()
>> NFSD_DRC_SIZE_SHIFT) * PAGE_SIZE;
- nfsd_serv->sv_drc_mem_used = 0;
+ nfsd_drc_mem_used = 0;
+ spin_lock_init(&nfsd_drc_lock);
dprintk("%s svc_drc_max_mem %u [in pages %lu]\n", __func__,
- nfsd_serv->sv_drc_max_mem,
- nfsd_serv->sv_drc_max_mem / PAGE_SIZE);
+ nfsd_drc_max_mem,
+ nfsd_drc_max_mem / PAGE_SIZE);
}
int nfsd_create_serv(void)
diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
index 2b49d67..a0cfb30 100644
--- a/include/linux/nfsd/nfsd.h
+++ b/include/linux/nfsd/nfsd.h
@@ -56,6 +56,11 @@ extern struct svc_version nfsd_version2, nfsd_version3,
extern u32 nfsd_supported_minorversion;
extern struct mutex nfsd_mutex;
extern struct svc_serv *nfsd_serv;
+extern spinlock_t nfsd_drc_lock;
+extern unsigned int nfsd_drc_max_mem;
+extern unsigned int nfsd_drc_mem_used;
+
+
extern struct seq_operations nfs_exports_op;
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
index 243508e..d0d8bf4 100644
--- a/include/linux/sunrpc/svc.h
+++ b/include/linux/sunrpc/svc.h
@@ -94,8 +94,6 @@ struct svc_serv {
struct module * sv_module; /* optional module to count when
* adding threads */
svc_thread_fn sv_function; /* main function for threads */
- unsigned int sv_drc_max_mem; /* Total pages for DRC */
- unsigned int sv_drc_mem_used;/* DRC pages used */
};
/*
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 10/30] nfsd41: set the session maximum response size cached
2009-06-08 18:20 ` [PATCH 09/30] nfsd41: use globals for DRC memory use management andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 11/30] nfsd41: use static buffers for sessions DRC andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
We don't cache the SEQUENCE operation because we can encode it from the session
slot values, so it is not included in NFSD_SLOT_CACHE_SIZE.
Fix the nfsd4_check_drc_limit() comment - the cache is no longer page based.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 10 +++++++---
fs/nfsd/nfs4xdr.c | 2 --
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index db56a8a..cdc2a5e 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -448,6 +448,12 @@ static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
}
}
+/* rpc header + encoded OP_SEQUENCE reply + NFSD_SLOT_CACHE_SIZE in bytes */
+#define NFSD_MAX_RESPONSE_CACHED ((RPC_MAX_HEADER_WITH_AUTH + \
+ 2 + /* OP_SEQUENCE header */ \
+ XDR_QUADLEN(NFS4_MAX_SESSIONID_LEN) + 5 + \
+ XDR_QUADLEN(NFSD_SLOT_CACHE_SIZE)) << 2)
+
/*
* fchan holds the client values on input, and the server values on output
*/
@@ -469,9 +475,7 @@ static int init_forechannel_attrs(struct svc_rqst *rqstp,
fchan->maxresp_sz = maxcount;
session->se_fmaxresp_sz = fchan->maxresp_sz;
- /* Set the max response cached size our default which is
- * a multiple of PAGE_SIZE and small */
- session->se_fmaxresp_cached = NFSD_PAGES_PER_SLOT * PAGE_SIZE;
+ session->se_fmaxresp_cached = NFSD_MAX_RESPONSE_CACHED;
fchan->maxresp_cached = session->se_fmaxresp_cached;
/* Use the client's maxops if possible */
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index b73549d..7e6b139 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3176,8 +3176,6 @@ static nfsd4_enc nfsd4_enc_ops[] = {
*
* Compare this length to the session se_fmaxresp_cached.
*
- * Our se_fmaxresp_cached will always be a multiple of PAGE_SIZE, and so
- * will be at least a page and will therefore hold the xdr_buf head.
*/
static int nfsd4_check_drc_limit(struct nfsd4_compoundres *resp)
{
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 11/30] nfsd41: use static buffers for sessions DRC
2009-06-08 18:20 ` [PATCH 10/30] nfsd41: set the session maximum response size cached andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 12/30] nfsd41: replace ce_cachethis with nfsd4_slot field andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Change from page based to memory based NFSv4.1 DRC.
We need to allocate memory for the session DRC in the CREATE_SESSION operation
because of the guarantee to the client that the memory resource is available
for caching responses.
In preparation to remove struct nfsd4_cache_entry, add static storage to
struct nfsd4_slot to hold up to NFSD_SLOT_CACH_SIZE of all encoded operation
data past the encoded sequence operation.
The encoded operation processing length is checked prior to the
nfsd4_store_cache_entry call by nfsd4_check_drc_limit. Note that
nfsd4_check_drc_limit() does this check after processing each operation which
is incorrect, it should be done prior to processing.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 12 ++++++++++++
fs/nfsd/nfs4xdr.c | 1 +
include/linux/nfsd/state.h | 2 ++
include/linux/nfsd/xdr4.h | 1 +
4 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index cdc2a5e..ab80a38 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1048,6 +1048,7 @@ nfsd4_copy_pages(struct page **topages, struct page **frompages, short count)
void
nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
{
+ struct nfsd4_slot *slot = resp->cstate.slot;
struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
struct svc_rqst *rqstp = resp->rqstp;
struct nfsd4_compoundargs *args = rqstp->rq_argp;
@@ -1072,10 +1073,17 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
if (nfsd4_not_cached(resp)) {
entry->ce_resused = 0;
entry->ce_rpchdrlen = 0;
+ slot->sl_datalen = 0;
dprintk("%s Just cache SEQUENCE. ce_cachethis %d\n", __func__,
resp->cstate.slot->sl_cache_entry.ce_cachethis);
return;
}
+ /* Length is checked to be <= se_fmaxresp_cached in
+ * nfsd4_check_drc_limit
+ */
+ slot->sl_datalen = (char *)resp->p - (char *)resp->cstate.datap;
+ memcpy(slot->sl_data, resp->cstate.datap, slot->sl_datalen);
+
entry->ce_resused = rqstp->rq_resused;
if (entry->ce_resused > NFSD_PAGES_PER_SLOT + 1)
entry->ce_resused = NFSD_PAGES_PER_SLOT + 1;
@@ -1123,6 +1131,7 @@ __be32
nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
struct nfsd4_sequence *seq)
{
+ struct nfsd4_slot *slot = resp->cstate.slot;
struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
__be32 status;
@@ -1143,6 +1152,9 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
return nfs_ok;
}
+ /* The sequence operation has been encoded, cstate->datap set. */
+ memcpy(resp->cstate.datap, slot->sl_data, slot->sl_datalen);
+
if (!nfsd41_copy_replay_data(resp, entry)) {
/*
* Not enough room to use the replay rpc header, send the
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 7e6b139..6f7e7b2 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3090,6 +3090,7 @@ nfsd4_encode_sequence(struct nfsd4_compoundres *resp, int nfserr,
WRITE32(0);
ADJUST_ARGS();
+ resp->cstate.datap = p; /* DRC cache data pointer */
return 0;
}
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 28ddb32..5319be5 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -120,6 +120,8 @@ struct nfsd4_cache_entry {
struct nfsd4_slot {
bool sl_inuse;
u32 sl_seqid;
+ u32 sl_datalen;
+ char sl_data[NFSD_SLOT_CACHE_SIZE];
struct nfsd4_cache_entry sl_cache_entry;
};
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
index 6e24dbb..9ab9ab6 100644
--- a/include/linux/nfsd/xdr4.h
+++ b/include/linux/nfsd/xdr4.h
@@ -52,6 +52,7 @@ struct nfsd4_compound_state {
struct nfsd4_session *session;
struct nfsd4_slot *slot;
__be32 *statp;
+ __be32 *datap;
size_t iovlen;
u32 minorversion;
u32 status;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 12/30] nfsd41: replace ce_cachethis with nfsd4_slot field
2009-06-08 18:20 ` [PATCH 11/30] nfsd41: use static buffers for sessions DRC andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 13/30] nfsd41: replace ce_opcnt " andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
In preparation to remove struct nfsd4_cache_entry
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4proc.c | 6 +++---
fs/nfsd/nfs4state.c | 10 +++++-----
fs/nfsd/nfs4xdr.c | 2 +-
include/linux/nfsd/state.h | 1 +
include/linux/nfsd/xdr4.h | 2 +-
5 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 13a6c58..3a2b12f 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -870,8 +870,8 @@ nfsd4_enc_uncached_replay(struct nfsd4_compoundargs *args,
{
struct nfsd4_op *op;
- dprintk("--> %s resp->opcnt %d ce_cachethis %u \n", __func__,
- resp->opcnt, resp->cstate.slot->sl_cache_entry.ce_cachethis);
+ dprintk("--> %s resp->opcnt %d cachethis %u \n", __func__,
+ resp->opcnt, resp->cstate.slot->sl_cachethis);
/* Encode the replayed sequence operation */
BUG_ON(resp->opcnt != 1);
@@ -879,7 +879,7 @@ nfsd4_enc_uncached_replay(struct nfsd4_compoundargs *args,
nfsd4_encode_operation(resp, op);
/*return nfserr_retry_uncached_rep in next operation. */
- if (resp->cstate.slot->sl_cache_entry.ce_cachethis == 0) {
+ if (resp->cstate.slot->sl_cachethis == 0) {
op = &args->ops[resp->opcnt++];
op->status = nfserr_retry_uncached_rep;
nfsd4_encode_operation(resp, op);
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index ab80a38..837c9cf 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1074,8 +1074,8 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
entry->ce_resused = 0;
entry->ce_rpchdrlen = 0;
slot->sl_datalen = 0;
- dprintk("%s Just cache SEQUENCE. ce_cachethis %d\n", __func__,
- resp->cstate.slot->sl_cache_entry.ce_cachethis);
+ dprintk("%s Just cache SEQUENCE. cachethis %d\n", __func__,
+ resp->cstate.slot->sl_cachethis);
return;
}
/* Length is checked to be <= se_fmaxresp_cached in
@@ -1532,10 +1532,10 @@ nfsd4_sequence(struct svc_rqst *rqstp,
/* Success! bump slot seqid */
slot->sl_inuse = true;
slot->sl_seqid = seq->seqid;
- slot->sl_cache_entry.ce_cachethis = seq->cachethis;
- /* Always set the cache entry cachethis for solo sequence */
+ slot->sl_cachethis = seq->cachethis;
+ /* Always set the slot cachethis for solo sequence */
if (nfsd4_is_solo_sequence(resp))
- slot->sl_cache_entry.ce_cachethis = 1;
+ slot->sl_cachethis = 1;
cstate->slot = slot;
cstate->session = session;
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 6f7e7b2..0250214 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3191,7 +3191,7 @@ static int nfsd4_check_drc_limit(struct nfsd4_compoundres *resp)
return status;
session = resp->cstate.session;
- if (session == NULL || slot->sl_cache_entry.ce_cachethis == 0)
+ if (session == NULL || slot->sl_cachethis == 0)
return status;
if (resp->opcnt >= args->opcnt)
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 5319be5..e818edc 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -120,6 +120,7 @@ struct nfsd4_cache_entry {
struct nfsd4_slot {
bool sl_inuse;
u32 sl_seqid;
+ int sl_cachethis;
u32 sl_datalen;
char sl_data[NFSD_SLOT_CACHE_SIZE];
struct nfsd4_cache_entry sl_cache_entry;
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
index 9ab9ab6..49d5ec9 100644
--- a/include/linux/nfsd/xdr4.h
+++ b/include/linux/nfsd/xdr4.h
@@ -470,7 +470,7 @@ static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp)
static inline bool nfsd4_not_cached(struct nfsd4_compoundres *resp)
{
- return !resp->cstate.slot->sl_cache_entry.ce_cachethis ||
+ return !resp->cstate.slot->sl_cachethis ||
nfsd4_is_solo_sequence(resp);
}
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 13/30] nfsd41: replace ce_opcnt with nfsd4_slot field
2009-06-08 18:20 ` [PATCH 12/30] nfsd41: replace ce_cachethis with nfsd4_slot field andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 14/30] nfsd41: nfsd41: replace ce_status " andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
In preparation to remove struct nfsd4_cache_entry
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 4 ++--
include/linux/nfsd/state.h | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 837c9cf..c5c372d 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1062,7 +1062,7 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
return;
nfsd4_release_respages(entry->ce_respages, entry->ce_resused);
- entry->ce_opcnt = resp->opcnt;
+ slot->sl_opcnt = resp->opcnt;
entry->ce_status = resp->cstate.status;
/*
@@ -1175,7 +1175,7 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
}
resp->rqstp->rq_resused = entry->ce_resused;
- resp->opcnt = entry->ce_opcnt;
+ resp->opcnt = slot->sl_opcnt;
resp->cstate.iovlen = entry->ce_datav.iov_len + entry->ce_rpchdrlen;
status = entry->ce_status;
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index e818edc..ceee37a 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -121,6 +121,7 @@ struct nfsd4_slot {
bool sl_inuse;
u32 sl_seqid;
int sl_cachethis;
+ int sl_opcnt;
u32 sl_datalen;
char sl_data[NFSD_SLOT_CACHE_SIZE];
struct nfsd4_cache_entry sl_cache_entry;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 14/30] nfsd41: nfsd41: replace ce_status with nfsd4_slot field
2009-06-08 18:20 ` [PATCH 13/30] nfsd41: replace ce_opcnt " andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 15/30] nfsd41: obliterate nfsd4_copy_pages andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
In preparation to remove struct nfsd4_cache_entry
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 4 ++--
include/linux/nfsd/state.h | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index c5c372d..45cca94 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1063,7 +1063,7 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
nfsd4_release_respages(entry->ce_respages, entry->ce_resused);
slot->sl_opcnt = resp->opcnt;
- entry->ce_status = resp->cstate.status;
+ slot->sl_status = resp->cstate.status;
/*
* Don't need a page to cache just the sequence operation - the slot
@@ -1177,7 +1177,7 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
resp->rqstp->rq_resused = entry->ce_resused;
resp->opcnt = slot->sl_opcnt;
resp->cstate.iovlen = entry->ce_datav.iov_len + entry->ce_rpchdrlen;
- status = entry->ce_status;
+ status = slot->sl_status;
return status;
}
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index ceee37a..65f8fb6 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -122,6 +122,7 @@ struct nfsd4_slot {
u32 sl_seqid;
int sl_cachethis;
int sl_opcnt;
+ __be32 sl_status;
u32 sl_datalen;
char sl_data[NFSD_SLOT_CACHE_SIZE];
struct nfsd4_cache_entry sl_cache_entry;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 15/30] nfsd41: obliterate nfsd4_copy_pages
2009-06-08 18:20 ` [PATCH 14/30] nfsd41: nfsd41: replace ce_status " andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 16/30] nfsd41: obliterate nfsd41_copy_replay_data andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Replacing page based drc cache with buffer based drc cache.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 21 ---------------------
1 files changed, 0 insertions(+), 21 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 45cca94..bc443ba 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1022,19 +1022,6 @@ nfsd4_release_respages(struct page **respages, short resused)
}
}
-static void
-nfsd4_copy_pages(struct page **topages, struct page **frompages, short count)
-{
- int i;
-
- for (i = 0; i < count; i++) {
- topages[i] = frompages[i];
- if (!topages[i])
- continue;
- get_page(topages[i]);
- }
-}
-
/*
* Cache the reply pages up to NFSD_PAGES_PER_SLOT + 1, clearing the previous
* pages. We add a page to NFSD_PAGES_PER_SLOT for the case where the total
@@ -1087,8 +1074,6 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
entry->ce_resused = rqstp->rq_resused;
if (entry->ce_resused > NFSD_PAGES_PER_SLOT + 1)
entry->ce_resused = NFSD_PAGES_PER_SLOT + 1;
- nfsd4_copy_pages(entry->ce_respages, rqstp->rq_respages,
- entry->ce_resused);
entry->ce_datav.iov_base = resp->cstate.statp;
entry->ce_datav.iov_len = resv->iov_len - ((char *)resp->cstate.statp -
(char *)page_address(rqstp->rq_respages[0]));
@@ -1161,17 +1146,11 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
* cached header. Release all the allocated result pages.
*/
svc_free_res_pages(resp->rqstp);
- nfsd4_copy_pages(resp->rqstp->rq_respages, entry->ce_respages,
- entry->ce_resused);
} else {
/* Release all but the first allocated result page */
resp->rqstp->rq_resused--;
svc_free_res_pages(resp->rqstp);
-
- nfsd4_copy_pages(&resp->rqstp->rq_respages[1],
- &entry->ce_respages[1],
- entry->ce_resused - 1);
}
resp->rqstp->rq_resused = entry->ce_resused;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 16/30] nfsd41: obliterate nfsd41_copy_replay_data
2009-06-08 18:20 ` [PATCH 15/30] nfsd41: obliterate nfsd4_copy_pages andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 17/30] nfsd41: obliterate nfsd4_release_respages andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Replacing page based drc cache with buffer based drc cache.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 39 ---------------------------------------
1 files changed, 0 insertions(+), 39 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index bc443ba..dbb84a3 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1083,32 +1083,6 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
}
/*
- * We keep the rpc header, but take the nfs reply from the replycache.
- */
-static int
-nfsd41_copy_replay_data(struct nfsd4_compoundres *resp,
- struct nfsd4_cache_entry *entry)
-{
- struct svc_rqst *rqstp = resp->rqstp;
- struct kvec *resv = &resp->rqstp->rq_res.head[0];
- int len;
-
- /* Current request rpc header length*/
- len = (char *)resp->cstate.statp -
- (char *)page_address(rqstp->rq_respages[0]);
- if (entry->ce_datav.iov_len + len > PAGE_SIZE) {
- dprintk("%s v41 cached reply too large (%Zd).\n", __func__,
- entry->ce_datav.iov_len);
- return 0;
- }
- /* copy the cached reply nfsd data past the current rpc header */
- memcpy((char *)resv->iov_base + len, entry->ce_datav.iov_base,
- entry->ce_datav.iov_len);
- resv->iov_len = len + entry->ce_datav.iov_len;
- return 1;
-}
-
-/*
* Keep the first page of the replay. Copy the NFSv4.1 data from the first
* cached page. Replace any futher replay pages from the cache.
*/
@@ -1140,19 +1114,6 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
/* The sequence operation has been encoded, cstate->datap set. */
memcpy(resp->cstate.datap, slot->sl_data, slot->sl_datalen);
- if (!nfsd41_copy_replay_data(resp, entry)) {
- /*
- * Not enough room to use the replay rpc header, send the
- * cached header. Release all the allocated result pages.
- */
- svc_free_res_pages(resp->rqstp);
- } else {
- /* Release all but the first allocated result page */
-
- resp->rqstp->rq_resused--;
- svc_free_res_pages(resp->rqstp);
- }
-
resp->rqstp->rq_resused = entry->ce_resused;
resp->opcnt = slot->sl_opcnt;
resp->cstate.iovlen = entry->ce_datav.iov_len + entry->ce_rpchdrlen;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 17/30] nfsd41: obliterate nfsd4_release_respages
2009-06-08 18:20 ` [PATCH 16/30] nfsd41: obliterate nfsd41_copy_replay_data andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:20 ` [PATCH 18/30] nfsd41: remove iovlen field from nfsd4_compound_state andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Replacing page based drc cache with buffer based drc cache.
Signed-off-by: Andy Adamson <andros@netapp.com
---
fs/nfsd/nfs4state.c | 25 -------------------------
1 files changed, 0 insertions(+), 25 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index dbb84a3..d494723 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -577,19 +577,12 @@ release_session(struct nfsd4_session *ses)
nfsd4_put_session(ses);
}
-static void nfsd4_release_respages(struct page **respages, short resused);
-
void
free_session(struct kref *kref)
{
struct nfsd4_session *ses;
- int i;
ses = container_of(kref, struct nfsd4_session, se_ref);
- for (i = 0; i < ses->se_fnumslots; i++) {
- struct nfsd4_cache_entry *e = &ses->se_slots[i].sl_cache_entry;
- nfsd4_release_respages(e->ce_respages, e->ce_resused);
- }
spin_lock(&nfsd_drc_lock);
nfsd_drc_mem_used -= ses->se_fnumslots * NFSD_SLOT_CACHE_SIZE;
spin_unlock(&nfsd_drc_lock);
@@ -1006,23 +999,6 @@ nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp)
}
/*
- * Dereference the result pages.
- */
-static void
-nfsd4_release_respages(struct page **respages, short resused)
-{
- int i;
-
- dprintk("--> %s\n", __func__);
- for (i = 0; i < resused; i++) {
- if (!respages[i])
- continue;
- put_page(respages[i]);
- respages[i] = NULL;
- }
-}
-
-/*
* Cache the reply pages up to NFSD_PAGES_PER_SLOT + 1, clearing the previous
* pages. We add a page to NFSD_PAGES_PER_SLOT for the case where the total
* length of the XDR response is less than se_fmaxresp_cached
@@ -1048,7 +1024,6 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
if (resp->opcnt == 1 && op->opnum == OP_SEQUENCE && resp->cstate.status)
return;
- nfsd4_release_respages(entry->ce_respages, entry->ce_resused);
slot->sl_opcnt = resp->opcnt;
slot->sl_status = resp->cstate.status;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 18/30] nfsd41: remove iovlen field from nfsd4_compound_state
2009-06-08 18:20 ` [PATCH 17/30] nfsd41: obliterate nfsd4_release_respages andros
@ 2009-06-08 18:20 ` andros
2009-06-08 18:21 ` [PATCH 19/30] nfsd41: remove struct nfsd4_cache_entry andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:20 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Set resp->p in nfsd4_replay_cache_entry so that the nfs4svc_encode_compoundres
iov_len calculation is correct.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 2 +-
fs/nfsd/nfs4xdr.c | 5 +----
include/linux/nfsd/xdr4.h | 1 -
3 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index d494723..7ef9b92 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1091,7 +1091,7 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
resp->rqstp->rq_resused = entry->ce_resused;
resp->opcnt = slot->sl_opcnt;
- resp->cstate.iovlen = entry->ce_datav.iov_len + entry->ce_rpchdrlen;
+ resp->p = resp->cstate.datap + XDR_QUADLEN(slot->sl_datalen);
status = slot->sl_status;
return status;
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 0250214..d09bb9d 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3334,10 +3334,7 @@ nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compo
iov->iov_len = ((char*)resp->p) - (char*)iov->iov_base;
BUG_ON(iov->iov_len > PAGE_SIZE);
if (nfsd4_has_session(&resp->cstate)) {
- if (resp->cstate.status == nfserr_replay_cache &&
- !nfsd4_not_cached(resp)) {
- iov->iov_len = resp->cstate.iovlen;
- } else {
+ if (resp->cstate.status != nfserr_replay_cache) {
nfsd4_store_cache_entry(resp);
dprintk("%s: SET SLOT STATE TO AVAILABLE\n", __func__);
resp->cstate.slot->sl_inuse = 0;
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
index 49d5ec9..2ee9b1d 100644
--- a/include/linux/nfsd/xdr4.h
+++ b/include/linux/nfsd/xdr4.h
@@ -53,7 +53,6 @@ struct nfsd4_compound_state {
struct nfsd4_slot *slot;
__be32 *statp;
__be32 *datap;
- size_t iovlen;
u32 minorversion;
u32 status;
};
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 19/30] nfsd41: remove struct nfsd4_cache_entry
2009-06-08 18:20 ` [PATCH 18/30] nfsd41: remove iovlen field from nfsd4_compound_state andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 20/30] nfsd41: obliterate nfsd4_set_statp andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
As part of the move from page based to buffer base DRC,
struct nfsd4_cache_entry fields have been replaced by fields in
struct nfsd4_slot.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 20 ++------------------
include/linux/nfsd/state.h | 27 +++++++--------------------
2 files changed, 9 insertions(+), 38 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 7ef9b92..55c7f3a 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1012,13 +1012,11 @@ void
nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
{
struct nfsd4_slot *slot = resp->cstate.slot;
- struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
struct svc_rqst *rqstp = resp->rqstp;
struct nfsd4_compoundargs *args = rqstp->rq_argp;
struct nfsd4_op *op = &args->ops[resp->opcnt];
- struct kvec *resv = &rqstp->rq_res.head[0];
- dprintk("--> %s entry %p\n", __func__, entry);
+ dprintk("--> %s\n", __func__);
/* Don't cache a failed OP_SEQUENCE. */
if (resp->opcnt == 1 && op->opnum == OP_SEQUENCE && resp->cstate.status)
@@ -1033,8 +1031,6 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
*/
if (nfsd4_not_cached(resp)) {
- entry->ce_resused = 0;
- entry->ce_rpchdrlen = 0;
slot->sl_datalen = 0;
dprintk("%s Just cache SEQUENCE. cachethis %d\n", __func__,
resp->cstate.slot->sl_cachethis);
@@ -1045,16 +1041,6 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
*/
slot->sl_datalen = (char *)resp->p - (char *)resp->cstate.datap;
memcpy(slot->sl_data, resp->cstate.datap, slot->sl_datalen);
-
- entry->ce_resused = rqstp->rq_resused;
- if (entry->ce_resused > NFSD_PAGES_PER_SLOT + 1)
- entry->ce_resused = NFSD_PAGES_PER_SLOT + 1;
- entry->ce_datav.iov_base = resp->cstate.statp;
- entry->ce_datav.iov_len = resv->iov_len - ((char *)resp->cstate.statp -
- (char *)page_address(rqstp->rq_respages[0]));
- /* Current request rpc header length*/
- entry->ce_rpchdrlen = (char *)resp->cstate.statp -
- (char *)page_address(rqstp->rq_respages[0]);
}
/*
@@ -1066,10 +1052,9 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
struct nfsd4_sequence *seq)
{
struct nfsd4_slot *slot = resp->cstate.slot;
- struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
__be32 status;
- dprintk("--> %s entry %p\n", __func__, entry);
+ dprintk("--> %s datalen %d\n", __func__, slot->sl_datalen);
/*
* If this is just the sequence operation, we did not keep
@@ -1089,7 +1074,6 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
/* The sequence operation has been encoded, cstate->datap set. */
memcpy(resp->cstate.datap, slot->sl_data, slot->sl_datalen);
- resp->rqstp->rq_resused = entry->ce_resused;
resp->opcnt = slot->sl_opcnt;
resp->p = resp->cstate.datap + XDR_QUADLEN(slot->sl_datalen);
status = slot->sl_status;
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 65f8fb6..3facf68 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -101,31 +101,18 @@ struct nfs4_callback {
/* Maximum number of slots per session. 128 is useful for long haul TCP */
#define NFSD_MAX_SLOTS_PER_SESSION 128
-/* Maximum number of pages per slot cache entry */
-#define NFSD_PAGES_PER_SLOT 1
#define NFSD_SLOT_CACHE_SIZE 512
/* Maximum number of operations per session compound */
#define NFSD_MAX_OPS_PER_COMPOUND 16
-struct nfsd4_cache_entry {
- __be32 ce_status;
- struct kvec ce_datav; /* encoded NFSv4.1 data in rq_res.head[0] */
- struct page *ce_respages[NFSD_PAGES_PER_SLOT + 1];
- int ce_cachethis;
- short ce_resused;
- int ce_opcnt;
- int ce_rpchdrlen;
-};
-
struct nfsd4_slot {
- bool sl_inuse;
- u32 sl_seqid;
- int sl_cachethis;
- int sl_opcnt;
- __be32 sl_status;
- u32 sl_datalen;
- char sl_data[NFSD_SLOT_CACHE_SIZE];
- struct nfsd4_cache_entry sl_cache_entry;
+ bool sl_inuse;
+ u32 sl_seqid;
+ int sl_cachethis;
+ int sl_opcnt;
+ __be32 sl_status;
+ u32 sl_datalen;
+ char sl_data[NFSD_SLOT_CACHE_SIZE];
};
struct nfsd4_channel_attrs {
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 20/30] nfsd41: obliterate nfsd4_set_statp
2009-06-08 18:21 ` [PATCH 19/30] nfsd41: remove struct nfsd4_cache_entry andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 21/30] nfsd41: rename nfsd4_enc_uncached_replay andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Replacing page based DRC cache with buffer based DRC cache, the cstate->statp
pointer is no longer necessary.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 8 --------
fs/nfsd/nfssvc.c | 4 ----
include/linux/nfsd/xdr4.h | 1 -
3 files changed, 0 insertions(+), 13 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 55c7f3a..19f6064 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -990,14 +990,6 @@ out_err:
return;
}
-void
-nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp)
-{
- struct nfsd4_compoundres *resp = rqstp->rq_resp;
-
- resp->cstate.statp = statp;
-}
-
/*
* Cache the reply pages up to NFSD_PAGES_PER_SLOT + 1, clearing the previous
* pages. We add a page to NFSD_PAGES_PER_SLOT for the case where the total
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index 37633f5..d14adea 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -572,10 +572,6 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
+ rqstp->rq_res.head[0].iov_len;
rqstp->rq_res.head[0].iov_len += sizeof(__be32);
- /* NFSv4.1 DRC requires statp */
- if (rqstp->rq_vers == 4)
- nfsd4_set_statp(rqstp, statp);
-
/* Now call the procedure handler, and encode NFS status. */
nfserr = proc->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
nfserr = map_new_errors(rqstp->rq_vers, nfserr);
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
index 2ee9b1d..505e3e3 100644
--- a/include/linux/nfsd/xdr4.h
+++ b/include/linux/nfsd/xdr4.h
@@ -51,7 +51,6 @@ struct nfsd4_compound_state {
/* For sessions DRC */
struct nfsd4_session *session;
struct nfsd4_slot *slot;
- __be32 *statp;
__be32 *datap;
u32 minorversion;
u32 status;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 21/30] nfsd41: rename nfsd4_enc_uncached_replay
2009-06-08 18:21 ` [PATCH 20/30] nfsd41: obliterate nfsd4_set_statp andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 22/30] nfsd41: encode replay sequence from the slot values andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
This function is only used for SEQUENCE replay.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4proc.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 3a2b12f..5db565b 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -865,7 +865,7 @@ static const char *nfsd4_op_name(unsigned opnum);
* encode the uncache rep error on the next operation.
*/
static __be32
-nfsd4_enc_uncached_replay(struct nfsd4_compoundargs *args,
+nfsd4_enc_sequence_replay(struct nfsd4_compoundargs *args,
struct nfsd4_compoundres *resp)
{
struct nfsd4_op *op;
@@ -1000,7 +1000,7 @@ encode_op:
if (resp->cstate.status == nfserr_replay_cache) {
dprintk("%s NFS4.1 replay from cache\n", __func__);
if (nfsd4_not_cached(resp))
- status = nfsd4_enc_uncached_replay(args, resp);
+ status = nfsd4_enc_sequence_replay(args, resp);
else
status = op->status;
goto out;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 22/30] nfsd41: encode replay sequence from the slot values
2009-06-08 18:21 ` [PATCH 21/30] nfsd41: rename nfsd4_enc_uncached_replay andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 23/30] nfsd41: fix nfsd4_replay_cache_entry comments andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
The sequence operation is not cached; always encode the sequence operation on
a replay from the slot table and session values. This simplifies the sessions
replay logic in nfsd4_proc_compound.
If this is a replay of a compound that was specified not to be cached, return
NFS4ERR_RETRY_UNCACHED_REP.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4proc.c | 33 +--------------------------------
fs/nfsd/nfs4state.c | 40 ++++++++++++++++++++++++++++++++++++----
2 files changed, 37 insertions(+), 36 deletions(-)
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
index 5db565b..f7ff1ab 100644
--- a/fs/nfsd/nfs4proc.c
+++ b/fs/nfsd/nfs4proc.c
@@ -860,34 +860,6 @@ static struct nfsd4_operation nfsd4_ops[];
static const char *nfsd4_op_name(unsigned opnum);
/*
- * This is a replay of a compound for which no cache entry pages
- * were used. Encode the sequence operation, and if cachethis is FALSE
- * encode the uncache rep error on the next operation.
- */
-static __be32
-nfsd4_enc_sequence_replay(struct nfsd4_compoundargs *args,
- struct nfsd4_compoundres *resp)
-{
- struct nfsd4_op *op;
-
- dprintk("--> %s resp->opcnt %d cachethis %u \n", __func__,
- resp->opcnt, resp->cstate.slot->sl_cachethis);
-
- /* Encode the replayed sequence operation */
- BUG_ON(resp->opcnt != 1);
- op = &args->ops[resp->opcnt - 1];
- nfsd4_encode_operation(resp, op);
-
- /*return nfserr_retry_uncached_rep in next operation. */
- if (resp->cstate.slot->sl_cachethis == 0) {
- op = &args->ops[resp->opcnt++];
- op->status = nfserr_retry_uncached_rep;
- nfsd4_encode_operation(resp, op);
- }
- return op->status;
-}
-
-/*
* Enforce NFSv4.1 COMPOUND ordering rules.
*
* TODO:
@@ -999,10 +971,7 @@ encode_op:
/* Only from SEQUENCE */
if (resp->cstate.status == nfserr_replay_cache) {
dprintk("%s NFS4.1 replay from cache\n", __func__);
- if (nfsd4_not_cached(resp))
- status = nfsd4_enc_sequence_replay(args, resp);
- else
- status = op->status;
+ status = op->status;
goto out;
}
if (op->status == nfserr_replay_me) {
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 19f6064..94c4c6c 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1036,6 +1036,36 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
}
/*
+ * Encode the replay sequence operation from the slot values.
+ * If cachethis is FALSE encode the uncached rep error on the next
+ * operation which sets resp->p and increments resp->opcnt for
+ * nfs4svc_encode_compoundres.
+ *
+ */
+static __be32
+nfsd4_enc_sequence_replay(struct nfsd4_compoundargs *args,
+ struct nfsd4_compoundres *resp)
+{
+ struct nfsd4_op *op;
+ struct nfsd4_slot *slot = resp->cstate.slot;
+
+ dprintk("--> %s resp->opcnt %d cachethis %u \n", __func__,
+ resp->opcnt, resp->cstate.slot->sl_cachethis);
+
+ /* Encode the replayed sequence operation */
+ op = &args->ops[resp->opcnt - 1];
+ nfsd4_encode_operation(resp, op);
+
+ /* Return nfserr_retry_uncached_rep in next operation. */
+ if (args->opcnt > 1 && slot->sl_cachethis == 0) {
+ op = &args->ops[resp->opcnt++];
+ op->status = nfserr_retry_uncached_rep;
+ nfsd4_encode_operation(resp, op);
+ }
+ return op->status;
+}
+
+/*
* Keep the first page of the replay. Copy the NFSv4.1 data from the first
* cached page. Replace any futher replay pages from the cache.
*/
@@ -1058,10 +1088,12 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
* session inactivity timer fires and a solo sequence operation
* is sent (lease renewal).
*/
- if (seq && nfsd4_not_cached(resp)) {
- seq->maxslots = resp->cstate.session->se_fnumslots;
- return nfs_ok;
- }
+ seq->maxslots = resp->cstate.session->se_fnumslots;
+
+ /* Either returns 0 or nfserr_retry_uncached */
+ status = nfsd4_enc_sequence_replay(resp->rqstp->rq_argp, resp);
+ if (status == nfserr_retry_uncached_rep)
+ return status;
/* The sequence operation has been encoded, cstate->datap set. */
memcpy(resp->cstate.datap, slot->sl_data, slot->sl_datalen);
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 23/30] nfsd41: fix nfsd4_replay_cache_entry comments
2009-06-08 18:21 ` [PATCH 22/30] nfsd41: encode replay sequence from the slot values andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 24/30] nfsd41: fix nfsd4_store_cache_entry comments andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 15 +++------------
1 files changed, 3 insertions(+), 12 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 94c4c6c..694cfb7 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1066,8 +1066,8 @@ nfsd4_enc_sequence_replay(struct nfsd4_compoundargs *args,
}
/*
- * Keep the first page of the replay. Copy the NFSv4.1 data from the first
- * cached page. Replace any futher replay pages from the cache.
+ * The sequence operation is not cached because we can use the slot and
+ * session values.
*/
__be32
nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
@@ -1078,16 +1078,7 @@ nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
dprintk("--> %s datalen %d\n", __func__, slot->sl_datalen);
- /*
- * If this is just the sequence operation, we did not keep
- * a page in the cache entry because we can just use the
- * slot info stored in struct nfsd4_sequence that was checked
- * against the slot in nfsd4_sequence().
- *
- * This occurs when seq->cachethis is FALSE, or when the client
- * session inactivity timer fires and a solo sequence operation
- * is sent (lease renewal).
- */
+ /* Target max slot and flags will be set once they are implemented */
seq->maxslots = resp->cstate.session->se_fnumslots;
/* Either returns 0 or nfserr_retry_uncached */
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 24/30] nfsd41: fix nfsd4_store_cache_entry comments
2009-06-08 18:21 ` [PATCH 23/30] nfsd41: fix nfsd4_replay_cache_entry comments andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 25/30] nfsd41: support 16 slots per session andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 15 +++------------
1 files changed, 3 insertions(+), 12 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 694cfb7..05b0190 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -991,14 +991,8 @@ out_err:
}
/*
- * Cache the reply pages up to NFSD_PAGES_PER_SLOT + 1, clearing the previous
- * pages. We add a page to NFSD_PAGES_PER_SLOT for the case where the total
- * length of the XDR response is less than se_fmaxresp_cached
- * (NFSD_PAGES_PER_SLOT * PAGE_SIZE) but the xdr_buf pages is used for a
- * of the reply (e.g. readdir).
- *
- * Store the base and length of the rq_req.head[0] page
- * of the NFSv4.1 data, just past the rpc header.
+ * Copy all encoded operation responses past the sequence response into the
+ * slot's cache.
*/
void
nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
@@ -1017,11 +1011,8 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
slot->sl_opcnt = resp->opcnt;
slot->sl_status = resp->cstate.status;
- /*
- * Don't need a page to cache just the sequence operation - the slot
- * does this for us!
- */
+ /* Don't cache the sequence operation, use the slot values on replay */
if (nfsd4_not_cached(resp)) {
slot->sl_datalen = 0;
dprintk("%s Just cache SEQUENCE. cachethis %d\n", __func__,
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 25/30] nfsd41: support 16 slots per session
2009-06-08 18:21 ` [PATCH 24/30] nfsd41: fix nfsd4_store_cache_entry comments andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 26/30] nfsd41: use the maximum operations per compound in nfsd4_compoundargs andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
128 slots is a bit much without proof that they are needed.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
include/linux/nfsd/state.h | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 3facf68..f2ccb64 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -99,8 +99,7 @@ struct nfs4_callback {
struct rpc_clnt * cb_client;
};
-/* Maximum number of slots per session. 128 is useful for long haul TCP */
-#define NFSD_MAX_SLOTS_PER_SESSION 128
+#define NFSD_MAX_SLOTS_PER_SESSION 16
#define NFSD_SLOT_CACHE_SIZE 512
/* Maximum number of operations per session compound */
#define NFSD_MAX_OPS_PER_COMPOUND 16
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 26/30] nfsd41: use the maximum operations per compound in nfsd4_compoundargs
2009-06-08 18:21 ` [PATCH 25/30] nfsd41: support 16 slots per session andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 27/30] nfsd41: fix nfsd4_store_cache_entry dprintk andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
The size of the nfsd4_op array in nfsd4_compoundargs determines the
supported maximum number of operations.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
include/linux/nfsd/state.h | 3 +--
include/linux/nfsd/xdr4.h | 2 +-
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index f2ccb64..7dfd01a 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -101,8 +101,7 @@ struct nfs4_callback {
#define NFSD_MAX_SLOTS_PER_SESSION 16
#define NFSD_SLOT_CACHE_SIZE 512
-/* Maximum number of operations per session compound */
-#define NFSD_MAX_OPS_PER_COMPOUND 16
+#define NFSD_MAX_OPS_PER_COMPOUND 8
struct nfsd4_slot {
bool sl_inuse;
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
index 505e3e3..026d3a5 100644
--- a/include/linux/nfsd/xdr4.h
+++ b/include/linux/nfsd/xdr4.h
@@ -443,7 +443,7 @@ struct nfsd4_compoundargs {
u32 minorversion;
u32 opcnt;
struct nfsd4_op *ops;
- struct nfsd4_op iops[8];
+ struct nfsd4_op iops[NFSD_MAX_OPS_PER_COMPOUND];
};
struct nfsd4_compoundres {
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 27/30] nfsd41: fix nfsd4_store_cache_entry dprintk
2009-06-08 18:21 ` [PATCH 26/30] nfsd41: use the maximum operations per compound in nfsd4_compoundargs andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 28/30] nfsd41: add test for failed sequence operation andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 4 +---
1 files changed, 1 insertions(+), 3 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 05b0190..c95f75d 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1002,7 +1002,7 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
struct nfsd4_compoundargs *args = rqstp->rq_argp;
struct nfsd4_op *op = &args->ops[resp->opcnt];
- dprintk("--> %s\n", __func__);
+ dprintk("--> %s cachethis %d\n", __func__, slot->sl_cachethis);
/* Don't cache a failed OP_SEQUENCE. */
if (resp->opcnt == 1 && op->opnum == OP_SEQUENCE && resp->cstate.status)
@@ -1015,8 +1015,6 @@ nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
/* Don't cache the sequence operation, use the slot values on replay */
if (nfsd4_not_cached(resp)) {
slot->sl_datalen = 0;
- dprintk("%s Just cache SEQUENCE. cachethis %d\n", __func__,
- resp->cstate.slot->sl_cachethis);
return;
}
/* Length is checked to be <= se_fmaxresp_cached in
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 28/30] nfsd41: add test for failed sequence operation
2009-06-08 18:21 ` [PATCH 27/30] nfsd41: fix nfsd4_store_cache_entry dprintk andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 29/30] nfsd41: remove redundant failed sequence check andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Failed sequence operations are not cached.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
include/linux/nfsd/xdr4.h | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
index 026d3a5..3dbbbc3 100644
--- a/include/linux/nfsd/xdr4.h
+++ b/include/linux/nfsd/xdr4.h
@@ -460,6 +460,13 @@ struct nfsd4_compoundres {
struct nfsd4_compound_state cstate;
};
+static inline bool nfsd4_is_failed_sequence(struct nfsd4_compoundres *resp)
+{
+ struct nfsd4_compoundargs *args = resp->rqstp->rq_argp;
+ return resp->opcnt == 1 && args->ops[0].opnum == OP_SEQUENCE &&
+ resp->cstate.status;
+}
+
static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp)
{
struct nfsd4_compoundargs *args = resp->rqstp->rq_argp;
@@ -469,7 +476,8 @@ static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp)
static inline bool nfsd4_not_cached(struct nfsd4_compoundres *resp)
{
return !resp->cstate.slot->sl_cachethis ||
- nfsd4_is_solo_sequence(resp);
+ nfsd4_is_solo_sequence(resp) ||
+ nfsd4_is_failed_sequence(resp);
}
#define NFS4_SVC_XDRSIZE sizeof(struct nfsd4_compoundargs)
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 29/30] nfsd41: remove redundant failed sequence check
2009-06-08 18:21 ` [PATCH 28/30] nfsd41: add test for failed sequence operation andros
@ 2009-06-08 18:21 ` andros
2009-06-08 18:21 ` [PATCH 30/30] nfsd41: only reference the session on non-replay sequence andros
0 siblings, 1 reply; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 7 -------
1 files changed, 0 insertions(+), 7 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index c95f75d..424b2da 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -998,16 +998,9 @@ void
nfsd4_store_cache_entry(struct nfsd4_compoundres *resp)
{
struct nfsd4_slot *slot = resp->cstate.slot;
- struct svc_rqst *rqstp = resp->rqstp;
- struct nfsd4_compoundargs *args = rqstp->rq_argp;
- struct nfsd4_op *op = &args->ops[resp->opcnt];
dprintk("--> %s cachethis %d\n", __func__, slot->sl_cachethis);
- /* Don't cache a failed OP_SEQUENCE. */
- if (resp->opcnt == 1 && op->opnum == OP_SEQUENCE && resp->cstate.status)
- return;
-
slot->sl_opcnt = resp->opcnt;
slot->sl_status = resp->cstate.status;
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
* [PATCH 30/30] nfsd41: only reference the session on non-replay sequence
2009-06-08 18:21 ` [PATCH 29/30] nfsd41: remove redundant failed sequence check andros
@ 2009-06-08 18:21 ` andros
0 siblings, 0 replies; 31+ messages in thread
From: andros @ 2009-06-08 18:21 UTC (permalink / raw)
To: bfields; +Cc: linux-nfs, Andy Adamson
From: Andy Adamson <andros@netapp.com>
Solo CREATE_SESSION replays used to share the logic in nfsdsvc_enc_compound_res
and use nfsd4_store_cache_entry, but not set the cstate session nor take a
reference on the session. CREATE_SESSION now uses it's own cache structure
and logic inside nfsd4_create_session.
The SEQUENCE operation only needs to reference the session to call
nfsd4_store_cache_entry.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 9 ++++-----
fs/nfsd/nfs4xdr.c | 14 ++++++--------
2 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index 424b2da..0b12cf3 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -1436,13 +1436,12 @@ nfsd4_sequence(struct svc_rqst *rqstp,
cstate->slot = slot;
cstate->session = session;
+ /* Hold a session reference until done caching the response */
+ nfsd4_get_session(session);
+
replay_cache:
- /* Renew the clientid on success and on replay.
- * Hold a session reference until done processing the compound:
- * nfsd4_put_session called only if the cstate slot is set.
- */
+ /* Renew the clientid on success and on replay */
renew_client(session->se_client);
- nfsd4_get_session(session);
out:
spin_unlock(&sessionid_lock);
dprintk("%s: return %d\n", __func__, ntohl(status));
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index d09bb9d..7bff6a3 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3320,6 +3320,7 @@ nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compo
/*
* All that remains is to write the tag and operation count...
*/
+ struct nfsd4_compound_state *cs = &resp->cstate;
struct kvec *iov;
p = resp->tagp;
*p++ = htonl(resp->taglen);
@@ -3333,14 +3334,11 @@ nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p, struct nfsd4_compo
iov = &rqstp->rq_res.head[0];
iov->iov_len = ((char*)resp->p) - (char*)iov->iov_base;
BUG_ON(iov->iov_len > PAGE_SIZE);
- if (nfsd4_has_session(&resp->cstate)) {
- if (resp->cstate.status != nfserr_replay_cache) {
- nfsd4_store_cache_entry(resp);
- dprintk("%s: SET SLOT STATE TO AVAILABLE\n", __func__);
- resp->cstate.slot->sl_inuse = 0;
- }
- if (resp->cstate.session)
- nfsd4_put_session(resp->cstate.session);
+ if (nfsd4_has_session(cs) && cs->status != nfserr_replay_cache) {
+ nfsd4_store_cache_entry(resp);
+ dprintk("%s: SET SLOT STATE TO AVAILABLE\n", __func__);
+ cs->slot->sl_inuse = 0;
+ nfsd4_put_session(cs->session);
}
return 1;
}
--
1.5.4.3
^ permalink raw reply related [flat|nested] 31+ messages in thread
end of thread, other threads:[~2009-06-08 18:21 UTC | newest]
Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-08 18:20 [PATCH 0/30] NFSv4.1 Server DRC rewrite Version 3 andros
2009-06-08 18:20 ` [PATCH 01/30] nfsd41: create_session check replay first andros
2009-06-08 18:20 ` [PATCH 02/30] nfsd41: change check_slot_seqid parameters andros
2009-06-08 18:20 ` [PATCH 03/30] nfsd41: declare clientid create session slot structure andros
2009-06-08 18:20 ` [PATCH 04/30] nfsd41: encode create_session result into clid cache andros
2009-06-08 18:20 ` [PATCH 05/30] nfsd41: replay solo and embedded create session andros
2009-06-08 18:20 ` [PATCH 06/30] nfsd41 remove the unused nfsd4_slot create session slot andros
2009-06-08 18:20 ` [PATCH 07/30] nfsd41: sanity check client drc maxreqs andros
2009-06-08 18:20 ` [PATCH 08/30] nfsd41: change from page to memory based drc limits andros
2009-06-08 18:20 ` [PATCH 09/30] nfsd41: use globals for DRC memory use management andros
2009-06-08 18:20 ` [PATCH 10/30] nfsd41: set the session maximum response size cached andros
2009-06-08 18:20 ` [PATCH 11/30] nfsd41: use static buffers for sessions DRC andros
2009-06-08 18:20 ` [PATCH 12/30] nfsd41: replace ce_cachethis with nfsd4_slot field andros
2009-06-08 18:20 ` [PATCH 13/30] nfsd41: replace ce_opcnt " andros
2009-06-08 18:20 ` [PATCH 14/30] nfsd41: nfsd41: replace ce_status " andros
2009-06-08 18:20 ` [PATCH 15/30] nfsd41: obliterate nfsd4_copy_pages andros
2009-06-08 18:20 ` [PATCH 16/30] nfsd41: obliterate nfsd41_copy_replay_data andros
2009-06-08 18:20 ` [PATCH 17/30] nfsd41: obliterate nfsd4_release_respages andros
2009-06-08 18:20 ` [PATCH 18/30] nfsd41: remove iovlen field from nfsd4_compound_state andros
2009-06-08 18:21 ` [PATCH 19/30] nfsd41: remove struct nfsd4_cache_entry andros
2009-06-08 18:21 ` [PATCH 20/30] nfsd41: obliterate nfsd4_set_statp andros
2009-06-08 18:21 ` [PATCH 21/30] nfsd41: rename nfsd4_enc_uncached_replay andros
2009-06-08 18:21 ` [PATCH 22/30] nfsd41: encode replay sequence from the slot values andros
2009-06-08 18:21 ` [PATCH 23/30] nfsd41: fix nfsd4_replay_cache_entry comments andros
2009-06-08 18:21 ` [PATCH 24/30] nfsd41: fix nfsd4_store_cache_entry comments andros
2009-06-08 18:21 ` [PATCH 25/30] nfsd41: support 16 slots per session andros
2009-06-08 18:21 ` [PATCH 26/30] nfsd41: use the maximum operations per compound in nfsd4_compoundargs andros
2009-06-08 18:21 ` [PATCH 27/30] nfsd41: fix nfsd4_store_cache_entry dprintk andros
2009-06-08 18:21 ` [PATCH 28/30] nfsd41: add test for failed sequence operation andros
2009-06-08 18:21 ` [PATCH 29/30] nfsd41: remove redundant failed sequence check andros
2009-06-08 18:21 ` [PATCH 30/30] nfsd41: only reference the session on non-replay sequence andros
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox