diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-03-29 19:58:22 -0500 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-03-29 19:58:22 -0500 |
| commit | 79072f38909e3d9883317238887460c39ddcc4cb (patch) | |
| tree | 28369f5a844535ff836565eefd62695b0e890fa3 /include/linux/sunrpc | |
| parent | 200d5a7684cc49ef4be40e832daf3f217e70dfbb (diff) | |
| parent | 55d8ca4f8094246da6e71889a4e04bfafaa78b10 (diff) | |
Merge branch 'upstream'
Diffstat (limited to 'include/linux/sunrpc')
| -rw-r--r-- | include/linux/sunrpc/cache.h | 145 | ||||
| -rw-r--r-- | include/linux/sunrpc/clnt.h | 20 | ||||
| -rw-r--r-- | include/linux/sunrpc/gss_krb5.h | 2 | ||||
| -rw-r--r-- | include/linux/sunrpc/metrics.h | 77 | ||||
| -rw-r--r-- | include/linux/sunrpc/rpc_pipe_fs.h | 2 | ||||
| -rw-r--r-- | include/linux/sunrpc/sched.h | 9 | ||||
| -rw-r--r-- | include/linux/sunrpc/stats.h | 4 | ||||
| -rw-r--r-- | include/linux/sunrpc/svcauth.h | 12 | ||||
| -rw-r--r-- | include/linux/sunrpc/xprt.h | 13 |
9 files changed, 133 insertions, 151 deletions
diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index c4e3ea7cf154..b5612c958cce 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h | |||
| @@ -50,7 +50,7 @@ struct cache_head { | |||
| 50 | time_t last_refresh; /* If CACHE_PENDING, this is when upcall | 50 | time_t last_refresh; /* If CACHE_PENDING, this is when upcall |
| 51 | * was sent, else this is when update was received | 51 | * was sent, else this is when update was received |
| 52 | */ | 52 | */ |
| 53 | atomic_t refcnt; | 53 | struct kref ref; |
| 54 | unsigned long flags; | 54 | unsigned long flags; |
| 55 | }; | 55 | }; |
| 56 | #define CACHE_VALID 0 /* Entry contains valid data */ | 56 | #define CACHE_VALID 0 /* Entry contains valid data */ |
| @@ -68,8 +68,7 @@ struct cache_detail { | |||
| 68 | atomic_t inuse; /* active user-space update or lookup */ | 68 | atomic_t inuse; /* active user-space update or lookup */ |
| 69 | 69 | ||
| 70 | char *name; | 70 | char *name; |
| 71 | void (*cache_put)(struct cache_head *, | 71 | void (*cache_put)(struct kref *); |
| 72 | struct cache_detail*); | ||
| 73 | 72 | ||
| 74 | void (*cache_request)(struct cache_detail *cd, | 73 | void (*cache_request)(struct cache_detail *cd, |
| 75 | struct cache_head *h, | 74 | struct cache_head *h, |
| @@ -81,6 +80,11 @@ struct cache_detail { | |||
| 81 | struct cache_detail *cd, | 80 | struct cache_detail *cd, |
| 82 | struct cache_head *h); | 81 | struct cache_head *h); |
| 83 | 82 | ||
| 83 | struct cache_head * (*alloc)(void); | ||
| 84 | int (*match)(struct cache_head *orig, struct cache_head *new); | ||
| 85 | void (*init)(struct cache_head *orig, struct cache_head *new); | ||
| 86 | void (*update)(struct cache_head *orig, struct cache_head *new); | ||
| 87 | |||
| 84 | /* fields below this comment are for internal use | 88 | /* fields below this comment are for internal use |
| 85 | * and should not be touched by cache owners | 89 | * and should not be touched by cache owners |
| 86 | */ | 90 | */ |
| @@ -123,126 +127,14 @@ struct cache_deferred_req { | |||
| 123 | int too_many); | 127 | int too_many); |
| 124 | }; | 128 | }; |
| 125 | 129 | ||
| 126 | /* | ||
| 127 | * just like a template in C++, this macro does cache lookup | ||
| 128 | * for us. | ||
| 129 | * The function is passed some sort of HANDLE from which a cache_detail | ||
| 130 | * structure can be determined (via SETUP, DETAIL), a template | ||
| 131 | * cache entry (type RTN*), and a "set" flag. Using the HASHFN and the | ||
| 132 | * TEST, the function will try to find a matching cache entry in the cache. | ||
| 133 | * If "set" == 0 : | ||
| 134 | * If an entry is found, it is returned | ||
| 135 | * If no entry is found, a new non-VALID entry is created. | ||
| 136 | * If "set" == 1 and INPLACE == 0 : | ||
| 137 | * If no entry is found a new one is inserted with data from "template" | ||
| 138 | * If a non-CACHE_VALID entry is found, it is updated from template using UPDATE | ||
| 139 | * If a CACHE_VALID entry is found, a new entry is swapped in with data | ||
| 140 | * from "template" | ||
| 141 | * If set == 1, and INPLACE == 1 : | ||
| 142 | * As above, except that if a CACHE_VALID entry is found, we UPDATE in place | ||
| 143 | * instead of swapping in a new entry. | ||
| 144 | * | ||
| 145 | * If the passed handle has the CACHE_NEGATIVE flag set, then UPDATE is not | ||
| 146 | * run but insteead CACHE_NEGATIVE is set in any new item. | ||
| 147 | 130 | ||
| 148 | * In any case, the new entry is returned with a reference count. | 131 | extern struct cache_head * |
| 149 | * | 132 | sunrpc_cache_lookup(struct cache_detail *detail, |
| 150 | * | 133 | struct cache_head *key, int hash); |
| 151 | * RTN is a struct type for a cache entry | 134 | extern struct cache_head * |
| 152 | * MEMBER is the member of the cache which is cache_head, which must be first | 135 | sunrpc_cache_update(struct cache_detail *detail, |
| 153 | * FNAME is the name for the function | 136 | struct cache_head *new, struct cache_head *old, int hash); |
| 154 | * ARGS are arguments to function and must contain RTN *item, int set. May | ||
| 155 | * also contain something to be usedby SETUP or DETAIL to find cache_detail. | ||
| 156 | * SETUP locates the cache detail and makes it available as... | ||
| 157 | * DETAIL identifies the cache detail, possibly set up by SETUP | ||
| 158 | * HASHFN returns a hash value of the cache entry "item" | ||
| 159 | * TEST tests if "tmp" matches "item" | ||
| 160 | * INIT copies key information from "item" to "new" | ||
| 161 | * UPDATE copies content information from "item" to "tmp" | ||
| 162 | * INPLACE is true if updates can happen inplace rather than allocating a new structure | ||
| 163 | * | ||
| 164 | * WARNING: any substantial changes to this must be reflected in | ||
| 165 | * net/sunrpc/svcauth.c(auth_domain_lookup) | ||
| 166 | * which is a similar routine that is open-coded. | ||
| 167 | */ | ||
| 168 | #define DefineCacheLookup(RTN,MEMBER,FNAME,ARGS,SETUP,DETAIL,HASHFN,TEST,INIT,UPDATE,INPLACE) \ | ||
| 169 | RTN *FNAME ARGS \ | ||
| 170 | { \ | ||
| 171 | RTN *tmp, *new=NULL; \ | ||
| 172 | struct cache_head **hp, **head; \ | ||
| 173 | SETUP; \ | ||
| 174 | head = &(DETAIL)->hash_table[HASHFN]; \ | ||
| 175 | retry: \ | ||
| 176 | if (set||new) write_lock(&(DETAIL)->hash_lock); \ | ||
| 177 | else read_lock(&(DETAIL)->hash_lock); \ | ||
| 178 | for(hp=head; *hp != NULL; hp = &tmp->MEMBER.next) { \ | ||
| 179 | tmp = container_of(*hp, RTN, MEMBER); \ | ||
| 180 | if (TEST) { /* found a match */ \ | ||
| 181 | \ | ||
| 182 | if (set && !INPLACE && test_bit(CACHE_VALID, &tmp->MEMBER.flags) && !new) \ | ||
| 183 | break; \ | ||
| 184 | \ | ||
| 185 | if (new) \ | ||
| 186 | {INIT;} \ | ||
| 187 | if (set) { \ | ||
| 188 | if (!INPLACE && test_bit(CACHE_VALID, &tmp->MEMBER.flags))\ | ||
| 189 | { /* need to swap in new */ \ | ||
| 190 | RTN *t2; \ | ||
| 191 | \ | ||
| 192 | new->MEMBER.next = tmp->MEMBER.next; \ | ||
| 193 | *hp = &new->MEMBER; \ | ||
| 194 | tmp->MEMBER.next = NULL; \ | ||
| 195 | t2 = tmp; tmp = new; new = t2; \ | ||
| 196 | } \ | ||
| 197 | if (test_bit(CACHE_NEGATIVE, &item->MEMBER.flags)) \ | ||
| 198 | set_bit(CACHE_NEGATIVE, &tmp->MEMBER.flags); \ | ||
| 199 | else { \ | ||
| 200 | UPDATE; \ | ||
| 201 | clear_bit(CACHE_NEGATIVE, &tmp->MEMBER.flags); \ | ||
| 202 | } \ | ||
| 203 | } \ | ||
| 204 | cache_get(&tmp->MEMBER); \ | ||
| 205 | if (set||new) write_unlock(&(DETAIL)->hash_lock); \ | ||
| 206 | else read_unlock(&(DETAIL)->hash_lock); \ | ||
| 207 | if (set) \ | ||
| 208 | cache_fresh(DETAIL, &tmp->MEMBER, item->MEMBER.expiry_time); \ | ||
| 209 | if (set && !INPLACE && new) cache_fresh(DETAIL, &new->MEMBER, 0); \ | ||
| 210 | if (new) (DETAIL)->cache_put(&new->MEMBER, DETAIL); \ | ||
| 211 | return tmp; \ | ||
| 212 | } \ | ||
| 213 | } \ | ||
| 214 | /* Didn't find anything */ \ | ||
| 215 | if (new) { \ | ||
| 216 | INIT; \ | ||
| 217 | new->MEMBER.next = *head; \ | ||
| 218 | *head = &new->MEMBER; \ | ||
| 219 | (DETAIL)->entries ++; \ | ||
| 220 | cache_get(&new->MEMBER); \ | ||
| 221 | if (set) { \ | ||
| 222 | tmp = new; \ | ||
| 223 | if (test_bit(CACHE_NEGATIVE, &item->MEMBER.flags)) \ | ||
| 224 | set_bit(CACHE_NEGATIVE, &tmp->MEMBER.flags); \ | ||
| 225 | else {UPDATE;} \ | ||
| 226 | } \ | ||
| 227 | } \ | ||
| 228 | if (set||new) write_unlock(&(DETAIL)->hash_lock); \ | ||
| 229 | else read_unlock(&(DETAIL)->hash_lock); \ | ||
| 230 | if (new && set) \ | ||
| 231 | cache_fresh(DETAIL, &new->MEMBER, item->MEMBER.expiry_time); \ | ||
| 232 | if (new) \ | ||
| 233 | return new; \ | ||
| 234 | new = kmalloc(sizeof(*new), GFP_KERNEL); \ | ||
| 235 | if (new) { \ | ||
| 236 | cache_init(&new->MEMBER); \ | ||
| 237 | goto retry; \ | ||
| 238 | } \ | ||
| 239 | return NULL; \ | ||
| 240 | } | ||
| 241 | 137 | ||
| 242 | #define DefineSimpleCacheLookup(STRUCT,INPLACE) \ | ||
| 243 | DefineCacheLookup(struct STRUCT, h, STRUCT##_lookup, (struct STRUCT *item, int set), /*no setup */, \ | ||
| 244 | & STRUCT##_cache, STRUCT##_hash(item), STRUCT##_match(item, tmp),\ | ||
| 245 | STRUCT##_init(new, item), STRUCT##_update(tmp, item),INPLACE) | ||
| 246 | 138 | ||
| 247 | #define cache_for_each(pos, detail, index, member) \ | 139 | #define cache_for_each(pos, detail, index, member) \ |
| 248 | for (({read_lock(&(detail)->hash_lock); index = (detail)->hash_size;}) ; \ | 140 | for (({read_lock(&(detail)->hash_lock); index = (detail)->hash_size;}) ; \ |
| @@ -258,22 +150,19 @@ extern void cache_clean_deferred(void *owner); | |||
| 258 | 150 | ||
| 259 | static inline struct cache_head *cache_get(struct cache_head *h) | 151 | static inline struct cache_head *cache_get(struct cache_head *h) |
| 260 | { | 152 | { |
| 261 | atomic_inc(&h->refcnt); | 153 | kref_get(&h->ref); |
| 262 | return h; | 154 | return h; |
| 263 | } | 155 | } |
| 264 | 156 | ||
| 265 | 157 | ||
| 266 | static inline int cache_put(struct cache_head *h, struct cache_detail *cd) | 158 | static inline void cache_put(struct cache_head *h, struct cache_detail *cd) |
| 267 | { | 159 | { |
| 268 | if (atomic_read(&h->refcnt) <= 2 && | 160 | if (atomic_read(&h->ref.refcount) <= 2 && |
| 269 | h->expiry_time < cd->nextcheck) | 161 | h->expiry_time < cd->nextcheck) |
| 270 | cd->nextcheck = h->expiry_time; | 162 | cd->nextcheck = h->expiry_time; |
| 271 | return atomic_dec_and_test(&h->refcnt); | 163 | kref_put(&h->ref, cd->cache_put); |
| 272 | } | 164 | } |
| 273 | 165 | ||
| 274 | extern void cache_init(struct cache_head *h); | ||
| 275 | extern void cache_fresh(struct cache_detail *detail, | ||
| 276 | struct cache_head *head, time_t expiry); | ||
| 277 | extern int cache_check(struct cache_detail *detail, | 166 | extern int cache_check(struct cache_detail *detail, |
| 278 | struct cache_head *h, struct cache_req *rqstp); | 167 | struct cache_head *h, struct cache_req *rqstp); |
| 279 | extern void cache_flush(void); | 168 | extern void cache_flush(void); |
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index f147e6b84332..8fe9f35eba31 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
| @@ -45,7 +45,8 @@ struct rpc_clnt { | |||
| 45 | char * cl_server; /* server machine name */ | 45 | char * cl_server; /* server machine name */ |
| 46 | char * cl_protname; /* protocol name */ | 46 | char * cl_protname; /* protocol name */ |
| 47 | struct rpc_auth * cl_auth; /* authenticator */ | 47 | struct rpc_auth * cl_auth; /* authenticator */ |
| 48 | struct rpc_stat * cl_stats; /* statistics */ | 48 | struct rpc_stat * cl_stats; /* per-program statistics */ |
| 49 | struct rpc_iostats * cl_metrics; /* per-client statistics */ | ||
| 49 | 50 | ||
| 50 | unsigned int cl_softrtry : 1,/* soft timeouts */ | 51 | unsigned int cl_softrtry : 1,/* soft timeouts */ |
| 51 | cl_intr : 1,/* interruptible */ | 52 | cl_intr : 1,/* interruptible */ |
| @@ -59,6 +60,7 @@ struct rpc_clnt { | |||
| 59 | int cl_nodelen; /* nodename length */ | 60 | int cl_nodelen; /* nodename length */ |
| 60 | char cl_nodename[UNX_MAXNODENAME]; | 61 | char cl_nodename[UNX_MAXNODENAME]; |
| 61 | char cl_pathname[30];/* Path in rpc_pipe_fs */ | 62 | char cl_pathname[30];/* Path in rpc_pipe_fs */ |
| 63 | struct vfsmount * cl_vfsmnt; | ||
| 62 | struct dentry * cl_dentry; /* inode */ | 64 | struct dentry * cl_dentry; /* inode */ |
| 63 | struct rpc_clnt * cl_parent; /* Points to parent of clones */ | 65 | struct rpc_clnt * cl_parent; /* Points to parent of clones */ |
| 64 | struct rpc_rtt cl_rtt_default; | 66 | struct rpc_rtt cl_rtt_default; |
| @@ -100,6 +102,8 @@ struct rpc_procinfo { | |||
| 100 | unsigned int p_bufsiz; /* req. buffer size */ | 102 | unsigned int p_bufsiz; /* req. buffer size */ |
| 101 | unsigned int p_count; /* call count */ | 103 | unsigned int p_count; /* call count */ |
| 102 | unsigned int p_timer; /* Which RTT timer to use */ | 104 | unsigned int p_timer; /* Which RTT timer to use */ |
| 105 | u32 p_statidx; /* Which procedure to account */ | ||
| 106 | char * p_name; /* name of procedure */ | ||
| 103 | }; | 107 | }; |
| 104 | 108 | ||
| 105 | #define RPC_CONGESTED(clnt) (RPCXPRT_CONGESTED((clnt)->cl_xprt)) | 109 | #define RPC_CONGESTED(clnt) (RPCXPRT_CONGESTED((clnt)->cl_xprt)) |
| @@ -137,20 +141,6 @@ size_t rpc_max_payload(struct rpc_clnt *); | |||
| 137 | void rpc_force_rebind(struct rpc_clnt *); | 141 | void rpc_force_rebind(struct rpc_clnt *); |
| 138 | int rpc_ping(struct rpc_clnt *clnt, int flags); | 142 | int rpc_ping(struct rpc_clnt *clnt, int flags); |
| 139 | 143 | ||
| 140 | static __inline__ | ||
| 141 | int rpc_call(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, int flags) | ||
| 142 | { | ||
| 143 | struct rpc_message msg = { | ||
| 144 | .rpc_proc = &clnt->cl_procinfo[proc], | ||
| 145 | .rpc_argp = argp, | ||
| 146 | .rpc_resp = resp, | ||
| 147 | .rpc_cred = NULL | ||
| 148 | }; | ||
| 149 | return rpc_call_sync(clnt, &msg, flags); | ||
| 150 | } | ||
| 151 | |||
| 152 | extern void rpciod_wake_up(void); | ||
| 153 | |||
| 154 | /* | 144 | /* |
| 155 | * Helper function for NFSroot support | 145 | * Helper function for NFSroot support |
| 156 | */ | 146 | */ |
diff --git a/include/linux/sunrpc/gss_krb5.h b/include/linux/sunrpc/gss_krb5.h index 2c3601d31045..1279280d7196 100644 --- a/include/linux/sunrpc/gss_krb5.h +++ b/include/linux/sunrpc/gss_krb5.h | |||
| @@ -53,6 +53,8 @@ struct krb5_ctx { | |||
| 53 | struct xdr_netobj mech_used; | 53 | struct xdr_netobj mech_used; |
| 54 | }; | 54 | }; |
| 55 | 55 | ||
| 56 | extern spinlock_t krb5_seq_lock; | ||
| 57 | |||
| 56 | #define KG_TOK_MIC_MSG 0x0101 | 58 | #define KG_TOK_MIC_MSG 0x0101 |
| 57 | #define KG_TOK_WRAP_MSG 0x0201 | 59 | #define KG_TOK_WRAP_MSG 0x0201 |
| 58 | 60 | ||
diff --git a/include/linux/sunrpc/metrics.h b/include/linux/sunrpc/metrics.h new file mode 100644 index 000000000000..8f96e9dc369a --- /dev/null +++ b/include/linux/sunrpc/metrics.h | |||
| @@ -0,0 +1,77 @@ | |||
| 1 | /* | ||
| 2 | * linux/include/linux/sunrpc/metrics.h | ||
| 3 | * | ||
| 4 | * Declarations for RPC client per-operation metrics | ||
| 5 | * | ||
| 6 | * Copyright (C) 2005 Chuck Lever <cel@netapp.com> | ||
| 7 | * | ||
| 8 | * RPC client per-operation statistics provide latency and retry | ||
| 9 | * information about each type of RPC procedure in a given RPC program. | ||
| 10 | * These statistics are not for detailed problem diagnosis, but simply | ||
| 11 | * to indicate whether the problem is local or remote. | ||
| 12 | * | ||
| 13 | * These counters are not meant to be human-readable, but are meant to be | ||
| 14 | * integrated into system monitoring tools such as "sar" and "iostat". As | ||
| 15 | * such, the counters are sampled by the tools over time, and are never | ||
| 16 | * zeroed after a file system is mounted. Moving averages can be computed | ||
| 17 | * by the tools by taking the difference between two instantaneous samples | ||
| 18 | * and dividing that by the time between the samples. | ||
| 19 | * | ||
| 20 | * The counters are maintained in a single array per RPC client, indexed | ||
| 21 | * by procedure number. There is no need to maintain separate counter | ||
| 22 | * arrays per-CPU because these counters are always modified behind locks. | ||
| 23 | */ | ||
| 24 | |||
| 25 | #ifndef _LINUX_SUNRPC_METRICS_H | ||
| 26 | #define _LINUX_SUNRPC_METRICS_H | ||
| 27 | |||
| 28 | #include <linux/seq_file.h> | ||
| 29 | |||
| 30 | #define RPC_IOSTATS_VERS "1.0" | ||
| 31 | |||
| 32 | struct rpc_iostats { | ||
| 33 | /* | ||
| 34 | * These counters give an idea about how many request | ||
| 35 | * transmissions are required, on average, to complete that | ||
| 36 | * particular procedure. Some procedures may require more | ||
| 37 | * than one transmission because the server is unresponsive, | ||
| 38 | * the client is retransmitting too aggressively, or the | ||
| 39 | * requests are large and the network is congested. | ||
| 40 | */ | ||
| 41 | unsigned long om_ops, /* count of operations */ | ||
| 42 | om_ntrans, /* count of RPC transmissions */ | ||
| 43 | om_timeouts; /* count of major timeouts */ | ||
| 44 | |||
| 45 | /* | ||
| 46 | * These count how many bytes are sent and received for a | ||
| 47 | * given RPC procedure type. This indicates how much load a | ||
| 48 | * particular procedure is putting on the network. These | ||
| 49 | * counts include the RPC and ULP headers, and the request | ||
| 50 | * payload. | ||
| 51 | */ | ||
| 52 | unsigned long long om_bytes_sent, /* count of bytes out */ | ||
| 53 | om_bytes_recv; /* count of bytes in */ | ||
| 54 | |||
| 55 | /* | ||
| 56 | * The length of time an RPC request waits in queue before | ||
| 57 | * transmission, the network + server latency of the request, | ||
| 58 | * and the total time the request spent from init to release | ||
| 59 | * are measured. | ||
| 60 | */ | ||
| 61 | unsigned long long om_queue, /* jiffies queued for xmit */ | ||
| 62 | om_rtt, /* jiffies for RPC RTT */ | ||
| 63 | om_execute; /* jiffies for RPC execution */ | ||
| 64 | } ____cacheline_aligned; | ||
| 65 | |||
| 66 | struct rpc_task; | ||
| 67 | struct rpc_clnt; | ||
| 68 | |||
| 69 | /* | ||
| 70 | * EXPORTed functions for managing rpc_iostats structures | ||
| 71 | */ | ||
| 72 | struct rpc_iostats * rpc_alloc_iostats(struct rpc_clnt *); | ||
| 73 | void rpc_count_iostats(struct rpc_task *); | ||
| 74 | void rpc_print_iostats(struct seq_file *, struct rpc_clnt *); | ||
| 75 | void rpc_free_iostats(struct rpc_iostats *); | ||
| 76 | |||
| 77 | #endif /* _LINUX_SUNRPC_METRICS_H */ | ||
diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index 63929349571f..2c2189cb30aa 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h | |||
| @@ -45,6 +45,8 @@ extern struct dentry *rpc_mkdir(char *, struct rpc_clnt *); | |||
| 45 | extern int rpc_rmdir(char *); | 45 | extern int rpc_rmdir(char *); |
| 46 | extern struct dentry *rpc_mkpipe(char *, void *, struct rpc_pipe_ops *, int flags); | 46 | extern struct dentry *rpc_mkpipe(char *, void *, struct rpc_pipe_ops *, int flags); |
| 47 | extern int rpc_unlink(char *); | 47 | extern int rpc_unlink(char *); |
| 48 | extern struct vfsmount *rpc_get_mount(void); | ||
| 49 | extern void rpc_put_mount(void); | ||
| 48 | 50 | ||
| 49 | #endif | 51 | #endif |
| 50 | #endif | 52 | #endif |
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 8b25629accd8..82a91bb22362 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h | |||
| @@ -86,6 +86,12 @@ struct rpc_task { | |||
| 86 | struct work_struct tk_work; /* Async task work queue */ | 86 | struct work_struct tk_work; /* Async task work queue */ |
| 87 | struct rpc_wait tk_wait; /* RPC wait */ | 87 | struct rpc_wait tk_wait; /* RPC wait */ |
| 88 | } u; | 88 | } u; |
| 89 | |||
| 90 | unsigned short tk_timeouts; /* maj timeouts */ | ||
| 91 | size_t tk_bytes_sent; /* total bytes sent */ | ||
| 92 | unsigned long tk_start; /* RPC task init timestamp */ | ||
| 93 | long tk_rtt; /* round-trip time (jiffies) */ | ||
| 94 | |||
| 89 | #ifdef RPC_DEBUG | 95 | #ifdef RPC_DEBUG |
| 90 | unsigned short tk_pid; /* debugging aid */ | 96 | unsigned short tk_pid; /* debugging aid */ |
| 91 | #endif | 97 | #endif |
| @@ -203,6 +209,7 @@ struct rpc_wait_queue { | |||
| 203 | unsigned char priority; /* current priority */ | 209 | unsigned char priority; /* current priority */ |
| 204 | unsigned char count; /* # task groups remaining serviced so far */ | 210 | unsigned char count; /* # task groups remaining serviced so far */ |
| 205 | unsigned char nr; /* # tasks remaining for cookie */ | 211 | unsigned char nr; /* # tasks remaining for cookie */ |
| 212 | unsigned short qlen; /* total # tasks waiting in queue */ | ||
| 206 | #ifdef RPC_DEBUG | 213 | #ifdef RPC_DEBUG |
| 207 | const char * name; | 214 | const char * name; |
| 208 | #endif | 215 | #endif |
| @@ -269,13 +276,13 @@ void * rpc_malloc(struct rpc_task *, size_t); | |||
| 269 | void rpc_free(struct rpc_task *); | 276 | void rpc_free(struct rpc_task *); |
| 270 | int rpciod_up(void); | 277 | int rpciod_up(void); |
| 271 | void rpciod_down(void); | 278 | void rpciod_down(void); |
| 272 | void rpciod_wake_up(void); | ||
| 273 | int __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *)); | 279 | int __rpc_wait_for_completion_task(struct rpc_task *task, int (*)(void *)); |
| 274 | #ifdef RPC_DEBUG | 280 | #ifdef RPC_DEBUG |
| 275 | void rpc_show_tasks(void); | 281 | void rpc_show_tasks(void); |
| 276 | #endif | 282 | #endif |
| 277 | int rpc_init_mempool(void); | 283 | int rpc_init_mempool(void); |
| 278 | void rpc_destroy_mempool(void); | 284 | void rpc_destroy_mempool(void); |
| 285 | extern struct workqueue_struct *rpciod_workqueue; | ||
| 279 | 286 | ||
| 280 | static inline void rpc_exit(struct rpc_task *task, int status) | 287 | static inline void rpc_exit(struct rpc_task *task, int status) |
| 281 | { | 288 | { |
diff --git a/include/linux/sunrpc/stats.h b/include/linux/sunrpc/stats.h index 0d6ed3c8bdc4..d93c24b47f3f 100644 --- a/include/linux/sunrpc/stats.h +++ b/include/linux/sunrpc/stats.h | |||
| @@ -50,7 +50,7 @@ struct proc_dir_entry * rpc_proc_register(struct rpc_stat *); | |||
| 50 | void rpc_proc_unregister(const char *); | 50 | void rpc_proc_unregister(const char *); |
| 51 | void rpc_proc_zero(struct rpc_program *); | 51 | void rpc_proc_zero(struct rpc_program *); |
| 52 | struct proc_dir_entry * svc_proc_register(struct svc_stat *, | 52 | struct proc_dir_entry * svc_proc_register(struct svc_stat *, |
| 53 | struct file_operations *); | 53 | const struct file_operations *); |
| 54 | void svc_proc_unregister(const char *); | 54 | void svc_proc_unregister(const char *); |
| 55 | 55 | ||
| 56 | void svc_seq_show(struct seq_file *, | 56 | void svc_seq_show(struct seq_file *, |
| @@ -65,7 +65,7 @@ static inline void rpc_proc_unregister(const char *p) {} | |||
| 65 | static inline void rpc_proc_zero(struct rpc_program *p) {} | 65 | static inline void rpc_proc_zero(struct rpc_program *p) {} |
| 66 | 66 | ||
| 67 | static inline struct proc_dir_entry *svc_proc_register(struct svc_stat *s, | 67 | static inline struct proc_dir_entry *svc_proc_register(struct svc_stat *s, |
| 68 | struct file_operations *f) { return NULL; } | 68 | const struct file_operations *f) { return NULL; } |
| 69 | static inline void svc_proc_unregister(const char *p) {} | 69 | static inline void svc_proc_unregister(const char *p) {} |
| 70 | 70 | ||
| 71 | static inline void svc_seq_show(struct seq_file *seq, | 71 | static inline void svc_seq_show(struct seq_file *seq, |
diff --git a/include/linux/sunrpc/svcauth.h b/include/linux/sunrpc/svcauth.h index c119ce7cbd22..2fe2087edd66 100644 --- a/include/linux/sunrpc/svcauth.h +++ b/include/linux/sunrpc/svcauth.h | |||
| @@ -45,9 +45,10 @@ struct svc_rqst; /* forward decl */ | |||
| 45 | * of ip addresses to the given client. | 45 | * of ip addresses to the given client. |
| 46 | */ | 46 | */ |
| 47 | struct auth_domain { | 47 | struct auth_domain { |
| 48 | struct cache_head h; | 48 | struct kref ref; |
| 49 | struct hlist_node hash; | ||
| 49 | char *name; | 50 | char *name; |
| 50 | int flavour; | 51 | struct auth_ops *flavour; |
| 51 | }; | 52 | }; |
| 52 | 53 | ||
| 53 | /* | 54 | /* |
| @@ -86,6 +87,9 @@ struct auth_domain { | |||
| 86 | * | 87 | * |
| 87 | * domain_release() | 88 | * domain_release() |
| 88 | * This call releases a domain. | 89 | * This call releases a domain. |
| 90 | * set_client() | ||
| 91 | * Givens a pending request (struct svc_rqst), finds and assigns | ||
| 92 | * an appropriate 'auth_domain' as the client. | ||
| 89 | */ | 93 | */ |
| 90 | struct auth_ops { | 94 | struct auth_ops { |
| 91 | char * name; | 95 | char * name; |
| @@ -117,7 +121,7 @@ extern void svc_auth_unregister(rpc_authflavor_t flavor); | |||
| 117 | extern struct auth_domain *unix_domain_find(char *name); | 121 | extern struct auth_domain *unix_domain_find(char *name); |
| 118 | extern void auth_domain_put(struct auth_domain *item); | 122 | extern void auth_domain_put(struct auth_domain *item); |
| 119 | extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom); | 123 | extern int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom); |
| 120 | extern struct auth_domain *auth_domain_lookup(struct auth_domain *item, int set); | 124 | extern struct auth_domain *auth_domain_lookup(char *name, struct auth_domain *new); |
| 121 | extern struct auth_domain *auth_domain_find(char *name); | 125 | extern struct auth_domain *auth_domain_find(char *name); |
| 122 | extern struct auth_domain *auth_unix_lookup(struct in_addr addr); | 126 | extern struct auth_domain *auth_unix_lookup(struct in_addr addr); |
| 123 | extern int auth_unix_forget_old(struct auth_domain *dom); | 127 | extern int auth_unix_forget_old(struct auth_domain *dom); |
| @@ -160,8 +164,6 @@ static inline unsigned long hash_mem(char *buf, int length, int bits) | |||
| 160 | return hash >> (BITS_PER_LONG - bits); | 164 | return hash >> (BITS_PER_LONG - bits); |
| 161 | } | 165 | } |
| 162 | 166 | ||
| 163 | extern struct cache_detail auth_domain_cache, ip_map_cache; | ||
| 164 | |||
| 165 | #endif /* __KERNEL__ */ | 167 | #endif /* __KERNEL__ */ |
| 166 | 168 | ||
| 167 | #endif /* _LINUX_SUNRPC_SVCAUTH_H_ */ | 169 | #endif /* _LINUX_SUNRPC_SVCAUTH_H_ */ |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index 6ef99b14ff09..7eebbab7160b 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
| @@ -114,6 +114,7 @@ struct rpc_xprt_ops { | |||
| 114 | void (*release_request)(struct rpc_task *task); | 114 | void (*release_request)(struct rpc_task *task); |
| 115 | void (*close)(struct rpc_xprt *xprt); | 115 | void (*close)(struct rpc_xprt *xprt); |
| 116 | void (*destroy)(struct rpc_xprt *xprt); | 116 | void (*destroy)(struct rpc_xprt *xprt); |
| 117 | void (*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq); | ||
| 117 | }; | 118 | }; |
| 118 | 119 | ||
| 119 | struct rpc_xprt { | 120 | struct rpc_xprt { |
| @@ -187,6 +188,18 @@ struct rpc_xprt { | |||
| 187 | 188 | ||
| 188 | struct list_head recv; | 189 | struct list_head recv; |
| 189 | 190 | ||
| 191 | struct { | ||
| 192 | unsigned long bind_count, /* total number of binds */ | ||
| 193 | connect_count, /* total number of connects */ | ||
| 194 | connect_start, /* connect start timestamp */ | ||
| 195 | connect_time, /* jiffies waiting for connect */ | ||
| 196 | sends, /* how many complete requests */ | ||
| 197 | recvs, /* how many complete requests */ | ||
| 198 | bad_xids; /* lookup_rqst didn't find XID */ | ||
| 199 | |||
| 200 | unsigned long long req_u, /* average requests on the wire */ | ||
| 201 | bklog_u; /* backlog queue utilization */ | ||
| 202 | } stat; | ||
| 190 | 203 | ||
| 191 | void (*old_data_ready)(struct sock *, int); | 204 | void (*old_data_ready)(struct sock *, int); |
| 192 | void (*old_state_change)(struct sock *); | 205 | void (*old_state_change)(struct sock *); |
