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