mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-20 10:44:23 +08:00
NFSv4.1: Support dynamic resizing of the session slot table
Allow the server to control the size of the session slot table by adjusting the value of sr_target_max_slots in the reply to the SEQUENCE operation. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
1b285ff16a
commit
97e548a93d
@ -492,10 +492,17 @@ static void nfs41_sequence_free_slot(struct nfs4_sequence_res *res)
|
|||||||
static void nfs41_set_target_slotid_locked(struct nfs4_slot_table *tbl,
|
static void nfs41_set_target_slotid_locked(struct nfs4_slot_table *tbl,
|
||||||
u32 target_highest_slotid)
|
u32 target_highest_slotid)
|
||||||
{
|
{
|
||||||
|
unsigned int max_slotid, i;
|
||||||
|
|
||||||
if (tbl->target_highest_slotid == target_highest_slotid)
|
if (tbl->target_highest_slotid == target_highest_slotid)
|
||||||
return;
|
return;
|
||||||
tbl->target_highest_slotid = target_highest_slotid;
|
tbl->target_highest_slotid = target_highest_slotid;
|
||||||
tbl->generation++;
|
tbl->generation++;
|
||||||
|
|
||||||
|
max_slotid = min(tbl->max_slots - 1, tbl->target_highest_slotid);
|
||||||
|
for (i = tbl->max_slotid + 1; i <= max_slotid; i++)
|
||||||
|
rpc_wake_up_next(&tbl->slot_tbl_waitq);
|
||||||
|
tbl->max_slotid = max_slotid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void nfs41_set_target_slotid(struct nfs4_slot_table *tbl,
|
void nfs41_set_target_slotid(struct nfs4_slot_table *tbl,
|
||||||
@ -622,8 +629,8 @@ static struct nfs4_slot *nfs4_alloc_slot(struct nfs4_slot_table *tbl)
|
|||||||
dprintk("--> %s used_slots=%04lx highest_used=%u max_slots=%u\n",
|
dprintk("--> %s used_slots=%04lx highest_used=%u max_slots=%u\n",
|
||||||
__func__, tbl->used_slots[0], tbl->highest_used_slotid,
|
__func__, tbl->used_slots[0], tbl->highest_used_slotid,
|
||||||
tbl->max_slots);
|
tbl->max_slots);
|
||||||
slotid = find_first_zero_bit(tbl->used_slots, tbl->max_slots);
|
slotid = find_first_zero_bit(tbl->used_slots, tbl->max_slotid + 1);
|
||||||
if (slotid >= tbl->max_slots)
|
if (slotid > tbl->max_slotid)
|
||||||
goto out;
|
goto out;
|
||||||
__set_bit(slotid, tbl->used_slots);
|
__set_bit(slotid, tbl->used_slots);
|
||||||
if (slotid > tbl->highest_used_slotid ||
|
if (slotid > tbl->highest_used_slotid ||
|
||||||
@ -5744,6 +5751,7 @@ static void nfs4_add_and_init_slots(struct nfs4_slot_table *tbl,
|
|||||||
tbl->highest_used_slotid = NFS4_NO_SLOT;
|
tbl->highest_used_slotid = NFS4_NO_SLOT;
|
||||||
tbl->target_highest_slotid = max_slots - 1;
|
tbl->target_highest_slotid = max_slots - 1;
|
||||||
tbl->server_highest_slotid = max_slots - 1;
|
tbl->server_highest_slotid = max_slots - 1;
|
||||||
|
tbl->max_slotid = max_slots - 1;
|
||||||
for (i = 0; i < tbl->max_slots; i++)
|
for (i = 0; i < tbl->max_slots; i++)
|
||||||
tbl->slots[i].seq_nr = ivalue;
|
tbl->slots[i].seq_nr = ivalue;
|
||||||
spin_unlock(&tbl->slot_tbl_lock);
|
spin_unlock(&tbl->slot_tbl_lock);
|
||||||
|
@ -254,15 +254,14 @@ static void nfs4_end_drain_session(struct nfs_client *clp)
|
|||||||
{
|
{
|
||||||
struct nfs4_session *ses = clp->cl_session;
|
struct nfs4_session *ses = clp->cl_session;
|
||||||
struct nfs4_slot_table *tbl;
|
struct nfs4_slot_table *tbl;
|
||||||
int max_slots;
|
unsigned int i;
|
||||||
|
|
||||||
if (ses == NULL)
|
if (ses == NULL)
|
||||||
return;
|
return;
|
||||||
tbl = &ses->fc_slot_table;
|
tbl = &ses->fc_slot_table;
|
||||||
if (test_and_clear_bit(NFS4_SESSION_DRAINING, &ses->session_state)) {
|
if (test_and_clear_bit(NFS4_SESSION_DRAINING, &ses->session_state)) {
|
||||||
spin_lock(&tbl->slot_tbl_lock);
|
spin_lock(&tbl->slot_tbl_lock);
|
||||||
max_slots = tbl->max_slots;
|
for (i = 0; i <= tbl->max_slotid; i++) {
|
||||||
while (max_slots--) {
|
|
||||||
if (rpc_wake_up_first(&tbl->slot_tbl_waitq,
|
if (rpc_wake_up_first(&tbl->slot_tbl_waitq,
|
||||||
nfs4_set_task_privileged,
|
nfs4_set_task_privileged,
|
||||||
NULL) == NULL)
|
NULL) == NULL)
|
||||||
@ -2043,6 +2042,7 @@ static int nfs4_recall_slot(struct nfs_client *clp)
|
|||||||
old = fc_tbl->slots;
|
old = fc_tbl->slots;
|
||||||
fc_tbl->slots = new;
|
fc_tbl->slots = new;
|
||||||
fc_tbl->max_slots = fc_tbl->target_highest_slotid + 1;
|
fc_tbl->max_slots = fc_tbl->target_highest_slotid + 1;
|
||||||
|
fc_tbl->max_slotid = fc_tbl->target_highest_slotid;
|
||||||
clp->cl_session->fc_attrs.max_reqs = fc_tbl->max_slots;
|
clp->cl_session->fc_attrs.max_reqs = fc_tbl->max_slots;
|
||||||
spin_unlock(&fc_tbl->slot_tbl_lock);
|
spin_unlock(&fc_tbl->slot_tbl_lock);
|
||||||
|
|
||||||
|
@ -215,6 +215,7 @@ struct nfs4_slot_table {
|
|||||||
spinlock_t slot_tbl_lock;
|
spinlock_t slot_tbl_lock;
|
||||||
struct rpc_wait_queue slot_tbl_waitq; /* allocators may wait here */
|
struct rpc_wait_queue slot_tbl_waitq; /* allocators may wait here */
|
||||||
u32 max_slots; /* # slots in table */
|
u32 max_slots; /* # slots in table */
|
||||||
|
u32 max_slotid; /* Max allowed slotid value */
|
||||||
u32 highest_used_slotid; /* sent to server on each SEQ.
|
u32 highest_used_slotid; /* sent to server on each SEQ.
|
||||||
* op for dynamic resizing */
|
* op for dynamic resizing */
|
||||||
u32 target_highest_slotid; /* Server max_slot target */
|
u32 target_highest_slotid; /* Server max_slot target */
|
||||||
|
Loading…
Reference in New Issue
Block a user