[go: nahoru, domu]

1d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/*
2d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER START
3d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
4d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
6d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is free software; you can redistribute it and/or modify
7d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * it under the terms of the GNU General Public License version 2 only,
8d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * as published by the Free Software Foundation.
9d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
10d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is distributed in the hope that it will be useful,
11d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * but WITHOUT ANY WARRANTY; without even the implied warranty of
12d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GNU General Public License version 2 for more details.  A copy is
14d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * included in the COPYING file that accompanied this code.
15d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
16d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * You should have received a copy of the GNU General Public License
17d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * along with this program; if not, write to the Free Software
18d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
20d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER END
21d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
22d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/*
23d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2011 Intel Corporation
24d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
25d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright 2012 Xyratex Technology Limited
26d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
27d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/*
28d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * lustre/ptlrpc/nrs_fifo.c
29d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
30d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Network Request Scheduler (NRS) FIFO policy
31d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
32d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Handles RPCs in a FIFO manner, as received from the network. This policy is
33d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * a logical wrapper around previous, non-NRS functionality. It is used as the
34d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * default and fallback policy for all types of RPCs on all PTLRPC service
35d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * partitions, for both regular and high-priority NRS heads. Default here means
36d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * the policy is the one enabled at PTLRPC service partition startup time, and
37d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * fallback means the policy is used to handle RPCs that are not handled
38d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * successfully or are not handled at all by any primary policy that may be
39d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * enabled on a given NRS head.
40d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
41d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Author: Liang Zhen <liang@whamcloud.com>
42d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Author: Nikitas Angelinas <nikitas_angelinas@xyratex.com>
43d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
44d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
45d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \addtogoup nrs
46d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * @{
47d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
48d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
49d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define DEBUG_SUBSYSTEM S_RPC
50e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/obd_support.h"
51e27db14919269176ec040479d199225a37aafb8cGreg Kroah-Hartman#include "../include/obd_class.h"
529fdaf8c0b92ab374f8501eb47855776afc928e45Greg Kroah-Hartman#include "../../include/linux/libcfs/libcfs.h"
53d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include "ptlrpc_internal.h"
54d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
55d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
56d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \name fifo
57d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
58d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * The FIFO policy is a logical wrapper around previous, non-NRS functionality.
59d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * It schedules RPCs in the same order as they are queued from LNet.
60d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
61d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * @{
62d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
63d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
64d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#define NRS_POL_NAME_FIFO	"fifo"
65d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
66d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
67d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Is called before the policy transitions into
68d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * ptlrpc_nrs_pol_state::NRS_POL_STATE_STARTED; allocates and initializes a
69d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * policy-specific private data structure.
70d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
71d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] policy The policy to start
72d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
73d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \retval -ENOMEM OOM error
74d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \retval  0	   success
75d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
76d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see nrs_policy_register()
77d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see nrs_policy_ctl()
78d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
79d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic int nrs_fifo_start(struct ptlrpc_nrs_policy *policy)
80d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
81d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	struct nrs_fifo_head *head;
82d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
83d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	OBD_CPT_ALLOC_PTR(head, nrs_pol2cptab(policy), nrs_pol2cptid(policy));
84d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (head == NULL)
85d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
86d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
87d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	INIT_LIST_HEAD(&head->fh_list);
88d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	policy->pol_private = head;
89d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return 0;
90d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
91d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
92d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
93d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Is called before the policy transitions into
94d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * ptlrpc_nrs_pol_state::NRS_POL_STATE_STOPPED; deallocates the policy-specific
95d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * private data structure.
96d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
97d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] policy The policy to stop
98d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
99d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see nrs_policy_stop0()
100d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
101d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic void nrs_fifo_stop(struct ptlrpc_nrs_policy *policy)
102d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
103d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	struct nrs_fifo_head *head = policy->pol_private;
104d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
105d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LASSERT(head != NULL);
106d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LASSERT(list_empty(&head->fh_list));
107d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
108d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	OBD_FREE_PTR(head);
109d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
110d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
111d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
112d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Is called for obtaining a FIFO policy resource.
113d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
114d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in]  policy	  The policy on which the request is being asked for
115d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in]  nrq	  The request for which resources are being taken
116d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in]  parent	  Parent resource, unused in this policy
117d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[out] resp	  Resources references are placed in this array
118d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in]  moving_req Signifies limited caller context; unused in this
119d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *			  policy
120d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
121d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \retval 1 The FIFO policy only has a one-level resource hierarchy, as since
122d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *	     it implements a simple scheduling algorithm in which request
123d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *	     priority is determined on the request arrival order, it does not
124d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *	     need to maintain a set of resources that would otherwise be used
125d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *	     to calculate a request's priority.
126d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
127d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see nrs_resource_get_safe()
128d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
129d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic int nrs_fifo_res_get(struct ptlrpc_nrs_policy *policy,
130d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    struct ptlrpc_nrs_request *nrq,
131d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    const struct ptlrpc_nrs_resource *parent,
132d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    struct ptlrpc_nrs_resource **resp, bool moving_req)
133d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
134d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	/**
135d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	 * Just return the resource embedded inside nrs_fifo_head, and end this
136d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	 * resource hierarchy reference request.
137d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	 */
138d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	*resp = &((struct nrs_fifo_head *)policy->pol_private)->fh_res;
139d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return 1;
140d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
141d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
142d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
143d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Called when getting a request from the FIFO policy for handling, or just
144d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * peeking; removes the request from the policy when it is to be handled.
145d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
146d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] policy The policy
147d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] peek   When set, signifies that we just want to examine the
148d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *		     request, and not handle it, so the request is not removed
149d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *		     from the policy.
150d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] force  Force the policy to return a request; unused in this
151d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *		     policy
152d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
153d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \retval The request to be handled; this is the next request in the FIFO
154d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *	   queue
155d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
156d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see ptlrpc_nrs_req_get_nolock()
157d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see nrs_request_get()
158d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
159d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic
160aff9d8e80489e2abe446094680009f6a23e8e6d7Greg Donaldstruct ptlrpc_nrs_request *nrs_fifo_req_get(struct ptlrpc_nrs_policy *policy,
161d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					     bool peek, bool force)
162d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
163d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	struct nrs_fifo_head	  *head = policy->pol_private;
164d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	struct ptlrpc_nrs_request *nrq;
165d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
166d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	nrq = unlikely(list_empty(&head->fh_list)) ? NULL :
167d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	      list_entry(head->fh_list.next, struct ptlrpc_nrs_request,
168d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			     nr_u.fifo.fr_list);
169d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
170d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (likely(!peek && nrq != NULL)) {
171d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		struct ptlrpc_request *req = container_of(nrq,
172d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao							  struct ptlrpc_request,
173d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao							  rq_nrq);
174d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
175d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		list_del_init(&nrq->nr_u.fifo.fr_list);
176d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
177b0f5aad587ea1fc3563d056609ee54a961ee1256Greg Kroah-Hartman		CDEBUG(D_RPCTRACE, "NRS start %s request from %s, seq: %llu\n",
178b0f5aad587ea1fc3563d056609ee54a961ee1256Greg Kroah-Hartman		       policy->pol_desc->pd_name, libcfs_id2str(req->rq_peer),
179b0f5aad587ea1fc3563d056609ee54a961ee1256Greg Kroah-Hartman		       nrq->nr_u.fifo.fr_sequence);
180d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
181d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
182d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return nrq;
183d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
184d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
185d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
186d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Adds request \a nrq to \a policy's list of queued requests
187d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
188d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] policy The policy
189d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] nrq    The request to add
190d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
191d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \retval 0 success; nrs_request_enqueue() assumes this function will always
192d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *		      succeed
193d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
194d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic int nrs_fifo_req_add(struct ptlrpc_nrs_policy *policy,
195d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    struct ptlrpc_nrs_request *nrq)
196d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
197d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	struct nrs_fifo_head *head;
198d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
199d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	head = container_of(nrs_request_resource(nrq), struct nrs_fifo_head,
200d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    fh_res);
201d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	/**
202d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	 * Only used for debugging
203d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	 */
204d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	nrq->nr_u.fifo.fr_sequence = head->fh_sequence++;
205d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	list_add_tail(&nrq->nr_u.fifo.fr_list, &head->fh_list);
206d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
207d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return 0;
208d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
209d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
210d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
211d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Removes request \a nrq from \a policy's list of queued requests.
212d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
213d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] policy The policy
214d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] nrq    The request to remove
215d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
216d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic void nrs_fifo_req_del(struct ptlrpc_nrs_policy *policy,
217d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			     struct ptlrpc_nrs_request *nrq)
218d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
219d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LASSERT(!list_empty(&nrq->nr_u.fifo.fr_list));
220d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	list_del_init(&nrq->nr_u.fifo.fr_list);
221d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
222d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
223d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
224d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Prints a debug statement right before the request \a nrq stops being
225d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * handled.
226d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
227d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] policy The policy handling the request
228d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \param[in] nrq    The request being handled
229d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
230d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see ptlrpc_server_finish_request()
231d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * \see ptlrpc_nrs_req_stop_nolock()
232d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
233d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic void nrs_fifo_req_stop(struct ptlrpc_nrs_policy *policy,
234d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      struct ptlrpc_nrs_request *nrq)
235d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
236d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	struct ptlrpc_request *req = container_of(nrq, struct ptlrpc_request,
237d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao						  rq_nrq);
238d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
239b0f5aad587ea1fc3563d056609ee54a961ee1256Greg Kroah-Hartman	CDEBUG(D_RPCTRACE, "NRS stop %s request from %s, seq: %llu\n",
240d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	       policy->pol_desc->pd_name, libcfs_id2str(req->rq_peer),
241d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	       nrq->nr_u.fifo.fr_sequence);
242d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
243d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
244d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
245d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * FIFO policy operations
246d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
247d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostatic const struct ptlrpc_nrs_pol_ops nrs_fifo_ops = {
248d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.op_policy_start	= nrs_fifo_start,
249d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.op_policy_stop		= nrs_fifo_stop,
250d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.op_res_get		= nrs_fifo_res_get,
251d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.op_req_get		= nrs_fifo_req_get,
252d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.op_req_enqueue		= nrs_fifo_req_add,
253d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.op_req_dequeue		= nrs_fifo_req_del,
254d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.op_req_stop		= nrs_fifo_req_stop,
255d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao};
256d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
257d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/**
258d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * FIFO policy configuration
259d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
260d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taostruct ptlrpc_nrs_pol_conf nrs_conf_fifo = {
261d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.nc_name		= NRS_POL_NAME_FIFO,
262d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.nc_ops			= &nrs_fifo_ops,
263d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.nc_compat		= nrs_policy_compat_all,
264d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	.nc_flags		= PTLRPC_NRS_FL_FALLBACK |
265d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				  PTLRPC_NRS_FL_REG_START
266d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao};
267d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
268d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** @} fifo */
269d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
270d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/** @} nrs */
271