pagevec: add ability to iterate a queue
Add a loop counter inside the folio_batch to let us iterate from 0-nr instead of decrementing nr and treating the batch as a stack. It would generate some very weird and suboptimal I/O patterns for page writeback to iterate over the batch as a stack. Link: https://lkml.kernel.org/r/20240215063649.2164017-11-hch@lst.de Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Jan Kara <jack@suse.cz> Acked-by: Dave Chinner <dchinner@redhat.com> Cc: Christian Brauner <brauner@kernel.org> Cc: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
807d1fe360
commit
535c5d9dad
@ -27,6 +27,7 @@ struct folio;
|
||||
*/
|
||||
struct folio_batch {
|
||||
unsigned char nr;
|
||||
unsigned char i;
|
||||
bool percpu_pvec_drained;
|
||||
struct folio *folios[PAGEVEC_SIZE];
|
||||
};
|
||||
@ -40,12 +41,14 @@ struct folio_batch {
|
||||
static inline void folio_batch_init(struct folio_batch *fbatch)
|
||||
{
|
||||
fbatch->nr = 0;
|
||||
fbatch->i = 0;
|
||||
fbatch->percpu_pvec_drained = false;
|
||||
}
|
||||
|
||||
static inline void folio_batch_reinit(struct folio_batch *fbatch)
|
||||
{
|
||||
fbatch->nr = 0;
|
||||
fbatch->i = 0;
|
||||
}
|
||||
|
||||
static inline unsigned int folio_batch_count(struct folio_batch *fbatch)
|
||||
@ -75,6 +78,21 @@ static inline unsigned folio_batch_add(struct folio_batch *fbatch,
|
||||
return folio_batch_space(fbatch);
|
||||
}
|
||||
|
||||
/**
|
||||
* folio_batch_next - Return the next folio to process.
|
||||
* @fbatch: The folio batch being processed.
|
||||
*
|
||||
* Use this function to implement a queue of folios.
|
||||
*
|
||||
* Return: The next folio in the queue, or NULL if the queue is empty.
|
||||
*/
|
||||
static inline struct folio *folio_batch_next(struct folio_batch *fbatch)
|
||||
{
|
||||
if (fbatch->i == fbatch->nr)
|
||||
return NULL;
|
||||
return fbatch->folios[fbatch->i++];
|
||||
}
|
||||
|
||||
void __folio_batch_release(struct folio_batch *pvec);
|
||||
|
||||
static inline void folio_batch_release(struct folio_batch *fbatch)
|
||||
|
Loading…
x
Reference in New Issue
Block a user