Commit 83e63226 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-4.11-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu

Pull percpu fixes from Tejun Heo:

 - the allocation path was updating pcpu_nr_empty_pop_pages without the
   required locking which can lead to incorrect handling of empty chunks
   (e.g. keeping too many around), which is buggy but shouldn't lead to
   critical failures. Fixed by adding the locking

 - a trivial patch to drop an unused param from pcpu_get_pages()

* 'for-4.11-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu:
  percpu: remove unused chunk_alloc parameter from pcpu_get_pages()
  percpu: acquire pcpu_lock when updating pcpu_nr_empty_pop_pages
parents fb5fe0fd 8a1df543
...@@ -21,7 +21,6 @@ static struct page *pcpu_chunk_page(struct pcpu_chunk *chunk, ...@@ -21,7 +21,6 @@ static struct page *pcpu_chunk_page(struct pcpu_chunk *chunk,
/** /**
* pcpu_get_pages - get temp pages array * pcpu_get_pages - get temp pages array
* @chunk: chunk of interest
* *
* Returns pointer to array of pointers to struct page which can be indexed * Returns pointer to array of pointers to struct page which can be indexed
* with pcpu_page_idx(). Note that there is only one array and accesses * with pcpu_page_idx(). Note that there is only one array and accesses
...@@ -30,7 +29,7 @@ static struct page *pcpu_chunk_page(struct pcpu_chunk *chunk, ...@@ -30,7 +29,7 @@ static struct page *pcpu_chunk_page(struct pcpu_chunk *chunk,
* RETURNS: * RETURNS:
* Pointer to temp pages array on success. * Pointer to temp pages array on success.
*/ */
static struct page **pcpu_get_pages(struct pcpu_chunk *chunk_alloc) static struct page **pcpu_get_pages(void)
{ {
static struct page **pages; static struct page **pages;
size_t pages_size = pcpu_nr_units * pcpu_unit_pages * sizeof(pages[0]); size_t pages_size = pcpu_nr_units * pcpu_unit_pages * sizeof(pages[0]);
...@@ -275,7 +274,7 @@ static int pcpu_populate_chunk(struct pcpu_chunk *chunk, ...@@ -275,7 +274,7 @@ static int pcpu_populate_chunk(struct pcpu_chunk *chunk,
{ {
struct page **pages; struct page **pages;
pages = pcpu_get_pages(chunk); pages = pcpu_get_pages();
if (!pages) if (!pages)
return -ENOMEM; return -ENOMEM;
...@@ -313,7 +312,7 @@ static void pcpu_depopulate_chunk(struct pcpu_chunk *chunk, ...@@ -313,7 +312,7 @@ static void pcpu_depopulate_chunk(struct pcpu_chunk *chunk,
* successful population attempt so the temp pages array must * successful population attempt so the temp pages array must
* be available now. * be available now.
*/ */
pages = pcpu_get_pages(chunk); pages = pcpu_get_pages();
BUG_ON(!pages); BUG_ON(!pages);
/* unmap and free */ /* unmap and free */
......
...@@ -1011,8 +1011,11 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, ...@@ -1011,8 +1011,11 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved,
mutex_unlock(&pcpu_alloc_mutex); mutex_unlock(&pcpu_alloc_mutex);
} }
if (chunk != pcpu_reserved_chunk) if (chunk != pcpu_reserved_chunk) {
spin_lock_irqsave(&pcpu_lock, flags);
pcpu_nr_empty_pop_pages -= occ_pages; pcpu_nr_empty_pop_pages -= occ_pages;
spin_unlock_irqrestore(&pcpu_lock, flags);
}
if (pcpu_nr_empty_pop_pages < PCPU_EMPTY_POP_PAGES_LOW) if (pcpu_nr_empty_pop_pages < PCPU_EMPTY_POP_PAGES_LOW)
pcpu_schedule_balance_work(); pcpu_schedule_balance_work();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment