mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
Fix cpusets update_cpumask
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>
This commit is contained in:
parent
020958b627
commit
8707d8b8c0
5 changed files with 243 additions and 5 deletions
58
include/linux/prio_heap.h
Normal file
58
include/linux/prio_heap.h
Normal file
|
@ -0,0 +1,58 @@
|
|||
#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 */
|
Loading…
Add table
Add a link
Reference in a new issue