diff options
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/sunrpc/svc.h | 69 |
1 files changed, 10 insertions, 59 deletions
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h index 4ebcdf91f3b3..3669e91c43b8 100644 --- a/include/linux/sunrpc/svc.h +++ b/include/linux/sunrpc/svc.h | |||
| @@ -170,7 +170,6 @@ static inline void svc_putu32(struct kvec *iov, __be32 val) | |||
| 170 | /* | 170 | /* |
| 171 | * The context of a single thread, including the request currently being | 171 | * The context of a single thread, including the request currently being |
| 172 | * processed. | 172 | * processed. |
| 173 | * NOTE: First two items must be prev/next. | ||
| 174 | */ | 173 | */ |
| 175 | struct svc_rqst { | 174 | struct svc_rqst { |
| 176 | struct list_head rq_list; /* idle list */ | 175 | struct list_head rq_list; /* idle list */ |
| @@ -189,12 +188,9 @@ struct svc_rqst { | |||
| 189 | 188 | ||
| 190 | struct xdr_buf rq_arg; | 189 | struct xdr_buf rq_arg; |
| 191 | struct xdr_buf rq_res; | 190 | struct xdr_buf rq_res; |
| 192 | struct page * rq_argpages[RPCSVC_MAXPAGES]; | 191 | struct page * rq_pages[RPCSVC_MAXPAGES]; |
| 193 | struct page * rq_respages[RPCSVC_MAXPAGES]; | 192 | struct page * *rq_respages; /* points into rq_pages */ |
| 194 | int rq_restailpage; | 193 | int rq_resused; /* number of pages used for result */ |
| 195 | short rq_argused; /* pages used for argument */ | ||
| 196 | short rq_arghi; /* pages available in argument page list */ | ||
| 197 | short rq_resused; /* pages used for result */ | ||
| 198 | 194 | ||
| 199 | __be32 rq_xid; /* transmission id */ | 195 | __be32 rq_xid; /* transmission id */ |
| 200 | u32 rq_prog; /* program number */ | 196 | u32 rq_prog; /* program number */ |
| @@ -255,63 +251,18 @@ xdr_ressize_check(struct svc_rqst *rqstp, __be32 *p) | |||
| 255 | return vec->iov_len <= PAGE_SIZE; | 251 | return vec->iov_len <= PAGE_SIZE; |
| 256 | } | 252 | } |
| 257 | 253 | ||
| 258 | static inline struct page * | 254 | static inline void svc_free_res_pages(struct svc_rqst *rqstp) |
| 259 | svc_take_res_page(struct svc_rqst *rqstp) | ||
| 260 | { | 255 | { |
| 261 | if (rqstp->rq_arghi <= rqstp->rq_argused) | 256 | while (rqstp->rq_resused) { |
| 262 | return NULL; | 257 | struct page **pp = (rqstp->rq_respages + |
| 263 | rqstp->rq_arghi--; | 258 | --rqstp->rq_resused); |
| 264 | rqstp->rq_respages[rqstp->rq_resused] = | 259 | if (*pp) { |
| 265 | rqstp->rq_argpages[rqstp->rq_arghi]; | 260 | put_page(*pp); |
| 266 | return rqstp->rq_respages[rqstp->rq_resused++]; | 261 | *pp = NULL; |
| 267 | } | ||
| 268 | |||
| 269 | static inline void svc_take_page(struct svc_rqst *rqstp) | ||
| 270 | { | ||
| 271 | if (rqstp->rq_arghi <= rqstp->rq_argused) { | ||
| 272 | WARN_ON(1); | ||
| 273 | return; | ||
| 274 | } | ||
| 275 | rqstp->rq_arghi--; | ||
| 276 | rqstp->rq_respages[rqstp->rq_resused] = | ||
| 277 | rqstp->rq_argpages[rqstp->rq_arghi]; | ||
| 278 | rqstp->rq_resused++; | ||
| 279 | } | ||
| 280 | |||
| 281 | static inline void svc_pushback_allpages(struct svc_rqst *rqstp) | ||
| 282 | { | ||
| 283 | while (rqstp->rq_resused) { | ||
| 284 | if (rqstp->rq_respages[--rqstp->rq_resused] == NULL) | ||
| 285 | continue; | ||
| 286 | rqstp->rq_argpages[rqstp->rq_arghi++] = | ||
| 287 | rqstp->rq_respages[rqstp->rq_resused]; | ||
| 288 | rqstp->rq_respages[rqstp->rq_resused] = NULL; | ||
| 289 | } | ||
| 290 | } | ||
| 291 | |||
| 292 | static inline void svc_pushback_unused_pages(struct svc_rqst *rqstp) | ||
| 293 | { | ||
| 294 | while (rqstp->rq_resused && | ||
| 295 | rqstp->rq_res.pages != &rqstp->rq_respages[rqstp->rq_resused]) { | ||
| 296 | |||
| 297 | if (rqstp->rq_respages[--rqstp->rq_resused] != NULL) { | ||
| 298 | rqstp->rq_argpages[rqstp->rq_arghi++] = | ||
| 299 | rqstp->rq_respages[rqstp->rq_resused]; | ||
| 300 | rqstp->rq_respages[rqstp->rq_resused] = NULL; | ||
| 301 | } | 262 | } |
| 302 | } | 263 | } |
| 303 | } | 264 | } |
| 304 | 265 | ||
| 305 | static inline void svc_free_allpages(struct svc_rqst *rqstp) | ||
| 306 | { | ||
| 307 | while (rqstp->rq_resused) { | ||
| 308 | if (rqstp->rq_respages[--rqstp->rq_resused] == NULL) | ||
| 309 | continue; | ||
| 310 | put_page(rqstp->rq_respages[rqstp->rq_resused]); | ||
| 311 | rqstp->rq_respages[rqstp->rq_resused] = NULL; | ||
| 312 | } | ||
| 313 | } | ||
| 314 | |||
| 315 | struct svc_deferred_req { | 266 | struct svc_deferred_req { |
| 316 | u32 prot; /* protocol (UDP or TCP) */ | 267 | u32 prot; /* protocol (UDP or TCP) */ |
| 317 | struct sockaddr_in addr; | 268 | struct sockaddr_in addr; |
