mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 08:58:07 +00:00
8707d8b8c0
Cause writes to cpuset "cpus" file to update cpus_allowed for member tasks: - collect batches of tasks under tasklist_lock and then call set_cpus_allowed() on them outside the lock (since this can sleep). - add a simple generic priority heap type to allow efficient collection of batches of tasks to be processed without duplicating or missing any tasks in subsequent batches. - make "cpus" file update a no-op if the mask hasn't changed - fix race between update_cpumask() and sched_setaffinity() by making sched_setaffinity() post-check that it's not running on any cpus outside cpuset_cpus_allowed(). [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Paul Menage <menage@google.com> Cc: Paul Jackson <pj@sgi.com> Cc: David Rientjes <rientjes@google.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Balbir Singh <balbir@in.ibm.com> Cc: Cedric Le Goater <clg@fr.ibm.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Serge Hallyn <serue@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
58 lines
1.8 KiB
C
58 lines
1.8 KiB
C
#ifndef _LINUX_PRIO_HEAP_H
|
|
#define _LINUX_PRIO_HEAP_H
|
|
|
|
/*
|
|
* Simple insertion-only static-sized priority heap containing
|
|
* pointers, based on CLR, chapter 7
|
|
*/
|
|
|
|
#include <linux/gfp.h>
|
|
|
|
/**
|
|
* struct ptr_heap - simple static-sized priority heap
|
|
* @ptrs - pointer to data area
|
|
* @max - max number of elements that can be stored in @ptrs
|
|
* @size - current number of valid elements in @ptrs (in the range 0..@size-1
|
|
* @gt: comparison operator, which should implement "greater than"
|
|
*/
|
|
struct ptr_heap {
|
|
void **ptrs;
|
|
int max;
|
|
int size;
|
|
int (*gt)(void *, void *);
|
|
};
|
|
|
|
/**
|
|
* heap_init - initialize an empty heap with a given memory size
|
|
* @heap: the heap structure to be initialized
|
|
* @size: amount of memory to use in bytes
|
|
* @gfp_mask: mask to pass to kmalloc()
|
|
* @gt: comparison operator, which should implement "greater than"
|
|
*/
|
|
extern int heap_init(struct ptr_heap *heap, size_t size, gfp_t gfp_mask,
|
|
int (*gt)(void *, void *));
|
|
|
|
/**
|
|
* heap_free - release a heap's storage
|
|
* @heap: the heap structure whose data should be released
|
|
*/
|
|
void heap_free(struct ptr_heap *heap);
|
|
|
|
/**
|
|
* heap_insert - insert a value into the heap and return any overflowed value
|
|
* @heap: the heap to be operated on
|
|
* @p: the pointer to be inserted
|
|
*
|
|
* Attempts to insert the given value into the priority heap. If the
|
|
* heap is full prior to the insertion, then the resulting heap will
|
|
* consist of the smallest @max elements of the original heap and the
|
|
* new element; the greatest element will be removed from the heap and
|
|
* returned. Note that the returned element will be the new element
|
|
* (i.e. no change to the heap) if the new element is greater than all
|
|
* elements currently in the heap.
|
|
*/
|
|
extern void *heap_insert(struct ptr_heap *heap, void *p);
|
|
|
|
|
|
|
|
#endif /* _LINUX_PRIO_HEAP_H */
|