> On Jul 8, 2021, at 7:30 PM, Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > On Thu, Jul 08, 2021 at 11:26:29AM -0400, Chuck Lever wrote: >> @@ -256,6 +256,9 @@ struct svc_rqst { >> struct page * *rq_next_page; /* next reply page to use */ >> struct page * *rq_page_end; /* one past the last page */ >> >> + struct page *rq_relpages[16]; >> + int rq_numrelpages; > > This is only one struct page away from being a pagevec ... ? > >> @@ -838,6 +839,33 @@ svc_set_num_threads_sync(struct svc_serv *serv, struct svc_pool *pool, int nrser >> } >> EXPORT_SYMBOL_GPL(svc_set_num_threads_sync); >> >> +static void svc_rqst_release_replaced_pages(struct svc_rqst *rqstp) >> +{ >> + release_pages(rqstp->rq_relpages, rqstp->rq_numrelpages); >> + rqstp->rq_numrelpages = 0; > > This would be pagevec_release() 986 void __pagevec_release(struct pagevec *pvec) 987 { 988 if (!pvec->percpu_pvec_drained) { 989 lru_add_drain(); 990 pvec->percpu_pvec_drained = true; 991 } 992 release_pages(pvec->pages, pagevec_count(pvec)); 993 pagevec_reinit(pvec); 994 } Pretty much the same under the bonnet. Fair enough! -- Chuck Lever