linux/drivers/staging/lustre/lustre/ptlrpc/ptlrpc_internal.h
<<
>>
Prefs
   1/*
   2 * GPL HEADER START
   3 *
   4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 only,
   8 * as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License version 2 for more details (a copy is included
  14 * in the LICENSE file that accompanied this code).
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * version 2 along with this program; If not, see
  18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
  19 *
  20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  21 * CA 95054 USA or visit www.sun.com if you need additional information or
  22 * have any questions.
  23 *
  24 * GPL HEADER END
  25 */
  26/*
  27 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 *
  30 * Copyright (c) 2011, 2012, Intel Corporation.
  31 */
  32/*
  33 * This file is part of Lustre, http://www.lustre.org/
  34 * Lustre is a trademark of Sun Microsystems, Inc.
  35 */
  36
  37/* Intramodule declarations for ptlrpc. */
  38
  39#ifndef PTLRPC_INTERNAL_H
  40#define PTLRPC_INTERNAL_H
  41
  42#include "../ldlm/ldlm_internal.h"
  43
  44struct ldlm_namespace;
  45struct obd_import;
  46struct ldlm_res_id;
  47struct ptlrpc_request_set;
  48extern int test_req_buffer_pressure;
  49extern struct mutex ptlrpc_all_services_mutex;
  50
  51int ptlrpc_start_thread(struct ptlrpc_service_part *svcpt, int wait);
  52/* ptlrpcd.c */
  53int ptlrpcd_start(int index, int max, const char *name, struct ptlrpcd_ctl *pc);
  54
  55/* client.c */
  56struct ptlrpc_bulk_desc *ptlrpc_new_bulk(unsigned npages, unsigned max_brw,
  57                                         unsigned type, unsigned portal);
  58int ptlrpc_request_cache_init(void);
  59void ptlrpc_request_cache_fini(void);
  60struct ptlrpc_request *ptlrpc_request_cache_alloc(gfp_t flags);
  61void ptlrpc_request_cache_free(struct ptlrpc_request *req);
  62void ptlrpc_init_xid(void);
  63
  64/* events.c */
  65int ptlrpc_init_portals(void);
  66void ptlrpc_exit_portals(void);
  67
  68void ptlrpc_request_handle_notconn(struct ptlrpc_request *);
  69void lustre_assert_wire_constants(void);
  70int ptlrpc_import_in_recovery(struct obd_import *imp);
  71int ptlrpc_set_import_discon(struct obd_import *imp, __u32 conn_cnt);
  72void ptlrpc_handle_failed_import(struct obd_import *imp);
  73int ptlrpc_replay_next(struct obd_import *imp, int *inflight);
  74void ptlrpc_initiate_recovery(struct obd_import *imp);
  75
  76int lustre_unpack_req_ptlrpc_body(struct ptlrpc_request *req, int offset);
  77int lustre_unpack_rep_ptlrpc_body(struct ptlrpc_request *req, int offset);
  78
  79int ptlrpc_sysfs_register_service(struct kset *parent,
  80                                  struct ptlrpc_service *svc);
  81void ptlrpc_sysfs_unregister_service(struct ptlrpc_service *svc);
  82
  83void ptlrpc_ldebugfs_register_service(struct dentry *debugfs_entry,
  84                                      struct ptlrpc_service *svc);
  85void ptlrpc_lprocfs_unregister_service(struct ptlrpc_service *svc);
  86void ptlrpc_lprocfs_rpc_sent(struct ptlrpc_request *req, long amount);
  87void ptlrpc_lprocfs_do_request_stat(struct ptlrpc_request *req,
  88                                     long q_usec, long work_usec);
  89
  90/* NRS */
  91
  92/**
  93 * NRS core object.
  94 *
  95 * Holds NRS core fields.
  96 */
  97struct nrs_core {
  98        /**
  99         * Protects nrs_core::nrs_policies, serializes external policy
 100         * registration/unregistration, and NRS core lprocfs operations.
 101         */
 102        struct mutex nrs_mutex;
 103        /* XXX: This is just for liblustre. Remove the #if defined directive
 104         * when the * "cfs_" prefix is dropped from cfs_list_head. */
 105        /**
 106         * List of all policy descriptors registered with NRS core; protected
 107         * by nrs_core::nrs_mutex.
 108         */
 109        struct list_head nrs_policies;
 110
 111};
 112
 113int ptlrpc_service_nrs_setup(struct ptlrpc_service *svc);
 114void ptlrpc_service_nrs_cleanup(struct ptlrpc_service *svc);
 115
 116void ptlrpc_nrs_req_initialize(struct ptlrpc_service_part *svcpt,
 117                               struct ptlrpc_request *req, bool hp);
 118void ptlrpc_nrs_req_finalize(struct ptlrpc_request *req);
 119void ptlrpc_nrs_req_stop_nolock(struct ptlrpc_request *req);
 120void ptlrpc_nrs_req_add(struct ptlrpc_service_part *svcpt,
 121                        struct ptlrpc_request *req, bool hp);
 122
 123struct ptlrpc_request *
 124ptlrpc_nrs_req_get_nolock0(struct ptlrpc_service_part *svcpt, bool hp,
 125                           bool peek, bool force);
 126
 127static inline struct ptlrpc_request *
 128ptlrpc_nrs_req_get_nolock(struct ptlrpc_service_part *svcpt, bool hp,
 129                          bool force)
 130{
 131        return ptlrpc_nrs_req_get_nolock0(svcpt, hp, false, force);
 132}
 133
 134static inline struct ptlrpc_request *
 135ptlrpc_nrs_req_peek_nolock(struct ptlrpc_service_part *svcpt, bool hp)
 136{
 137        return ptlrpc_nrs_req_get_nolock0(svcpt, hp, true, false);
 138}
 139
 140void ptlrpc_nrs_req_del_nolock(struct ptlrpc_request *req);
 141bool ptlrpc_nrs_req_pending_nolock(struct ptlrpc_service_part *svcpt, bool hp);
 142
 143int ptlrpc_nrs_policy_control(const struct ptlrpc_service *svc,
 144                              enum ptlrpc_nrs_queue_type queue, char *name,
 145                              enum ptlrpc_nrs_ctl opc, bool single, void *arg);
 146
 147int ptlrpc_nrs_init(void);
 148void ptlrpc_nrs_fini(void);
 149
 150static inline bool nrs_svcpt_has_hp(const struct ptlrpc_service_part *svcpt)
 151{
 152        return svcpt->scp_nrs_hp != NULL;
 153}
 154
 155static inline bool nrs_svc_has_hp(const struct ptlrpc_service *svc)
 156{
 157        /**
 158         * If the first service partition has an HP NRS head, all service
 159         * partitions will.
 160         */
 161        return nrs_svcpt_has_hp(svc->srv_parts[0]);
 162}
 163
 164static inline
 165struct ptlrpc_nrs *nrs_svcpt2nrs(struct ptlrpc_service_part *svcpt, bool hp)
 166{
 167        LASSERT(ergo(hp, nrs_svcpt_has_hp(svcpt)));
 168        return hp ? svcpt->scp_nrs_hp : &svcpt->scp_nrs_reg;
 169}
 170
 171static inline int nrs_pol2cptid(const struct ptlrpc_nrs_policy *policy)
 172{
 173        return policy->pol_nrs->nrs_svcpt->scp_cpt;
 174}
 175
 176static inline
 177struct ptlrpc_service *nrs_pol2svc(struct ptlrpc_nrs_policy *policy)
 178{
 179        return policy->pol_nrs->nrs_svcpt->scp_service;
 180}
 181
 182static inline
 183struct ptlrpc_service_part *nrs_pol2svcpt(struct ptlrpc_nrs_policy *policy)
 184{
 185        return policy->pol_nrs->nrs_svcpt;
 186}
 187
 188static inline
 189struct cfs_cpt_table *nrs_pol2cptab(struct ptlrpc_nrs_policy *policy)
 190{
 191        return nrs_pol2svc(policy)->srv_cptable;
 192}
 193
 194static inline struct ptlrpc_nrs_resource *
 195nrs_request_resource(struct ptlrpc_nrs_request *nrq)
 196{
 197        LASSERT(nrq->nr_initialized);
 198        LASSERT(!nrq->nr_finalized);
 199
 200        return nrq->nr_res_ptrs[nrq->nr_res_idx];
 201}
 202
 203static inline
 204struct ptlrpc_nrs_policy *nrs_request_policy(struct ptlrpc_nrs_request *nrq)
 205{
 206        return nrs_request_resource(nrq)->res_policy;
 207}
 208
 209#define NRS_LPROCFS_QUANTUM_NAME_REG    "reg_quantum:"
 210#define NRS_LPROCFS_QUANTUM_NAME_HP     "hp_quantum:"
 211
 212/**
 213 * the maximum size of nrs_crrn_client::cc_quantum and nrs_orr_data::od_quantum.
 214 */
 215#define LPROCFS_NRS_QUANTUM_MAX         65535
 216
 217/**
 218 * Max valid command string is the size of the labels, plus "65535" twice, plus
 219 * a separating space character.
 220 */
 221#define LPROCFS_NRS_WR_QUANTUM_MAX_CMD                                         \
 222 sizeof(NRS_LPROCFS_QUANTUM_NAME_REG __stringify(LPROCFS_NRS_QUANTUM_MAX) " "  \
 223        NRS_LPROCFS_QUANTUM_NAME_HP __stringify(LPROCFS_NRS_QUANTUM_MAX))
 224
 225/* recovd_thread.c */
 226
 227int ptlrpc_expire_one_request(struct ptlrpc_request *req, int async_unlink);
 228
 229/* pers.c */
 230void ptlrpc_fill_bulk_md(lnet_md_t *md, struct ptlrpc_bulk_desc *desc,
 231                         int mdcnt);
 232void ptlrpc_add_bulk_page(struct ptlrpc_bulk_desc *desc, struct page *page,
 233                          int pageoffset, int len);
 234
 235/* pack_generic.c */
 236struct ptlrpc_reply_state *
 237lustre_get_emerg_rs(struct ptlrpc_service_part *svcpt);
 238void lustre_put_emerg_rs(struct ptlrpc_reply_state *rs);
 239
 240/* pinger.c */
 241int ptlrpc_start_pinger(void);
 242int ptlrpc_stop_pinger(void);
 243void ptlrpc_pinger_sending_on_import(struct obd_import *imp);
 244void ptlrpc_pinger_commit_expected(struct obd_import *imp);
 245void ptlrpc_pinger_wake_up(void);
 246void ptlrpc_ping_import_soon(struct obd_import *imp);
 247int ping_evictor_wake(struct obd_export *exp);
 248
 249/* sec_null.c */
 250int  sptlrpc_null_init(void);
 251void sptlrpc_null_fini(void);
 252
 253/* sec_plain.c */
 254int  sptlrpc_plain_init(void);
 255void sptlrpc_plain_fini(void);
 256
 257/* sec_bulk.c */
 258int  sptlrpc_enc_pool_init(void);
 259void sptlrpc_enc_pool_fini(void);
 260int sptlrpc_proc_enc_pool_seq_show(struct seq_file *m, void *v);
 261
 262/* sec_lproc.c */
 263int  sptlrpc_lproc_init(void);
 264void sptlrpc_lproc_fini(void);
 265
 266/* sec_gc.c */
 267int sptlrpc_gc_init(void);
 268void sptlrpc_gc_fini(void);
 269
 270/* sec_config.c */
 271void sptlrpc_conf_choose_flavor(enum lustre_sec_part from,
 272                                enum lustre_sec_part to,
 273                                struct obd_uuid *target,
 274                                lnet_nid_t nid,
 275                                struct sptlrpc_flavor *sf);
 276int  sptlrpc_conf_init(void);
 277void sptlrpc_conf_fini(void);
 278
 279/* sec.c */
 280int  sptlrpc_init(void);
 281void sptlrpc_fini(void);
 282
 283static inline int ll_rpc_recoverable_error(int rc)
 284{
 285        return (rc == -ENOTCONN || rc == -ENODEV);
 286}
 287
 288static inline int tgt_mod_init(void)
 289{
 290        return 0;
 291}
 292
 293static inline void tgt_mod_exit(void)
 294{
 295        return;
 296}
 297
 298static inline void ptlrpc_reqset_put(struct ptlrpc_request_set *set)
 299{
 300        if (atomic_dec_and_test(&set->set_refcount))
 301                OBD_FREE_PTR(set);
 302}
 303#endif /* PTLRPC_INTERNAL_H */
 304