mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge branch 'akpm' (patches from Andrew)
Merge more updates from Andrew Morton: - a bit more MM - procfs updates - dynamic-debug fixes - lib/ updates - checkpatch - epoll - nilfs2 - signals - rapidio - PID management cleanup and optimization - kcov updates - sysvipc updates - quite a few misc things all over the place * emailed patches from Andrew Morton <[email protected]>: (94 commits) EXPERT Kconfig menu: fix broken EXPERT menu include/asm-generic/topology.h: remove unused parent_node() macro arch/tile/include/asm/topology.h: remove unused parent_node() macro arch/sparc/include/asm/topology_64.h: remove unused parent_node() macro arch/sh/include/asm/topology.h: remove unused parent_node() macro arch/ia64/include/asm/topology.h: remove unused parent_node() macro drivers/pcmcia/sa1111_badge4.c: avoid unused function warning mm: add infrastructure for get_user_pages_fast() benchmarking sysvipc: make get_maxid O(1) again sysvipc: properly name ipc_addid() limit parameter sysvipc: duplicate lock comments wrt ipc_addid() sysvipc: unteach ids->next_id for !CHECKPOINT_RESTORE initramfs: use time64_t timestamps drivers/watchdog: make use of devm_register_reboot_notifier() kernel/reboot.c: add devm_register_reboot_notifier() kcov: update documentation Makefile: support flag -fsanitizer-coverage=trace-cmp kcov: support comparison operands collection kcov: remove pointless current != NULL check kernel/panic.c: add TAINT_AUX ...
This commit is contained in:
commit
fa7f578076
115 changed files with 1892 additions and 952 deletions
137
fs/eventpoll.c
137
fs/eventpoll.c
|
|
@ -276,12 +276,6 @@ static DEFINE_MUTEX(epmutex);
|
|||
/* Used to check for epoll file descriptor inclusion loops */
|
||||
static struct nested_calls poll_loop_ncalls;
|
||||
|
||||
/* Used for safe wake up implementation */
|
||||
static struct nested_calls poll_safewake_ncalls;
|
||||
|
||||
/* Used to call file's f_op->poll() under the nested calls boundaries */
|
||||
static struct nested_calls poll_readywalk_ncalls;
|
||||
|
||||
/* Slab cache used to allocate "struct epitem" */
|
||||
static struct kmem_cache *epi_cache __read_mostly;
|
||||
|
||||
|
|
@ -551,40 +545,21 @@ out_unlock:
|
|||
* this special case of epoll.
|
||||
*/
|
||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||
static inline void ep_wake_up_nested(wait_queue_head_t *wqueue,
|
||||
unsigned long events, int subclass)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave_nested(&wqueue->lock, flags, subclass);
|
||||
wake_up_locked_poll(wqueue, events);
|
||||
spin_unlock_irqrestore(&wqueue->lock, flags);
|
||||
}
|
||||
#else
|
||||
static inline void ep_wake_up_nested(wait_queue_head_t *wqueue,
|
||||
unsigned long events, int subclass)
|
||||
{
|
||||
wake_up_poll(wqueue, events);
|
||||
}
|
||||
#endif
|
||||
static struct nested_calls poll_safewake_ncalls;
|
||||
|
||||
static int ep_poll_wakeup_proc(void *priv, void *cookie, int call_nests)
|
||||
{
|
||||
ep_wake_up_nested((wait_queue_head_t *) cookie, POLLIN,
|
||||
1 + call_nests);
|
||||
unsigned long flags;
|
||||
wait_queue_head_t *wqueue = (wait_queue_head_t *)cookie;
|
||||
|
||||
spin_lock_irqsave_nested(&wqueue->lock, flags, call_nests + 1);
|
||||
wake_up_locked_poll(wqueue, POLLIN);
|
||||
spin_unlock_irqrestore(&wqueue->lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform a safe wake up of the poll wait list. The problem is that
|
||||
* with the new callback'd wake up system, it is possible that the
|
||||
* poll callback is reentered from inside the call to wake_up() done
|
||||
* on the poll wait queue head. The rule is that we cannot reenter the
|
||||
* wake up code from the same task more than EP_MAX_NESTS times,
|
||||
* and we cannot reenter the same wait queue head at all. This will
|
||||
* enable to have a hierarchy of epoll file descriptor of no more than
|
||||
* EP_MAX_NESTS deep.
|
||||
*/
|
||||
static void ep_poll_safewake(wait_queue_head_t *wq)
|
||||
{
|
||||
int this_cpu = get_cpu();
|
||||
|
|
@ -595,6 +570,15 @@ static void ep_poll_safewake(wait_queue_head_t *wq)
|
|||
put_cpu();
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void ep_poll_safewake(wait_queue_head_t *wq)
|
||||
{
|
||||
wake_up_poll(wq, POLLIN);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void ep_remove_wait_queue(struct eppoll_entry *pwq)
|
||||
{
|
||||
wait_queue_head_t *whead;
|
||||
|
|
@ -880,11 +864,33 @@ static int ep_eventpoll_release(struct inode *inode, struct file *file)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned int ep_item_poll(struct epitem *epi, poll_table *pt)
|
||||
{
|
||||
pt->_key = epi->event.events;
|
||||
static int ep_read_events_proc(struct eventpoll *ep, struct list_head *head,
|
||||
void *priv);
|
||||
static void ep_ptable_queue_proc(struct file *file, wait_queue_head_t *whead,
|
||||
poll_table *pt);
|
||||
|
||||
return epi->ffd.file->f_op->poll(epi->ffd.file, pt) & epi->event.events;
|
||||
/*
|
||||
* Differs from ep_eventpoll_poll() in that internal callers already have
|
||||
* the ep->mtx so we need to start from depth=1, such that mutex_lock_nested()
|
||||
* is correctly annotated.
|
||||
*/
|
||||
static unsigned int ep_item_poll(struct epitem *epi, poll_table *pt, int depth)
|
||||
{
|
||||
struct eventpoll *ep;
|
||||
bool locked;
|
||||
|
||||
pt->_key = epi->event.events;
|
||||
if (!is_file_epoll(epi->ffd.file))
|
||||
return epi->ffd.file->f_op->poll(epi->ffd.file, pt) &
|
||||
epi->event.events;
|
||||
|
||||
ep = epi->ffd.file->private_data;
|
||||
poll_wait(epi->ffd.file, &ep->poll_wait, pt);
|
||||
locked = pt && (pt->_qproc == ep_ptable_queue_proc);
|
||||
|
||||
return ep_scan_ready_list(epi->ffd.file->private_data,
|
||||
ep_read_events_proc, &depth, depth,
|
||||
locked) & epi->event.events;
|
||||
}
|
||||
|
||||
static int ep_read_events_proc(struct eventpoll *ep, struct list_head *head,
|
||||
|
|
@ -892,13 +898,15 @@ static int ep_read_events_proc(struct eventpoll *ep, struct list_head *head,
|
|||
{
|
||||
struct epitem *epi, *tmp;
|
||||
poll_table pt;
|
||||
int depth = *(int *)priv;
|
||||
|
||||
init_poll_funcptr(&pt, NULL);
|
||||
depth++;
|
||||
|
||||
list_for_each_entry_safe(epi, tmp, head, rdllink) {
|
||||
if (ep_item_poll(epi, &pt))
|
||||
if (ep_item_poll(epi, &pt, depth)) {
|
||||
return POLLIN | POLLRDNORM;
|
||||
else {
|
||||
} else {
|
||||
/*
|
||||
* Item has been dropped into the ready list by the poll
|
||||
* callback, but it's not actually ready, as far as
|
||||
|
|
@ -912,48 +920,20 @@ static int ep_read_events_proc(struct eventpoll *ep, struct list_head *head,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void ep_ptable_queue_proc(struct file *file, wait_queue_head_t *whead,
|
||||
poll_table *pt);
|
||||
|
||||
struct readyevents_arg {
|
||||
struct eventpoll *ep;
|
||||
bool locked;
|
||||
};
|
||||
|
||||
static int ep_poll_readyevents_proc(void *priv, void *cookie, int call_nests)
|
||||
{
|
||||
struct readyevents_arg *arg = priv;
|
||||
|
||||
return ep_scan_ready_list(arg->ep, ep_read_events_proc, NULL,
|
||||
call_nests + 1, arg->locked);
|
||||
}
|
||||
|
||||
static unsigned int ep_eventpoll_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
int pollflags;
|
||||
struct eventpoll *ep = file->private_data;
|
||||
struct readyevents_arg arg;
|
||||
|
||||
/*
|
||||
* During ep_insert() we already hold the ep->mtx for the tfile.
|
||||
* Prevent re-aquisition.
|
||||
*/
|
||||
arg.locked = wait && (wait->_qproc == ep_ptable_queue_proc);
|
||||
arg.ep = ep;
|
||||
int depth = 0;
|
||||
|
||||
/* Insert inside our poll wait queue */
|
||||
poll_wait(file, &ep->poll_wait, wait);
|
||||
|
||||
/*
|
||||
* Proceed to find out if wanted events are really available inside
|
||||
* the ready list. This need to be done under ep_call_nested()
|
||||
* supervision, since the call to f_op->poll() done on listed files
|
||||
* could re-enter here.
|
||||
* the ready list.
|
||||
*/
|
||||
pollflags = ep_call_nested(&poll_readywalk_ncalls, EP_MAX_NESTS,
|
||||
ep_poll_readyevents_proc, &arg, ep, current);
|
||||
|
||||
return pollflags != -1 ? pollflags : 0;
|
||||
return ep_scan_ready_list(ep, ep_read_events_proc,
|
||||
&depth, depth, false);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
|
@ -1472,7 +1452,7 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event,
|
|||
* this operation completes, the poll callback can start hitting
|
||||
* the new item.
|
||||
*/
|
||||
revents = ep_item_poll(epi, &epq.pt);
|
||||
revents = ep_item_poll(epi, &epq.pt, 1);
|
||||
|
||||
/*
|
||||
* We have to check if something went wrong during the poll wait queue
|
||||
|
|
@ -1606,7 +1586,7 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even
|
|||
* Get current event bits. We can safely use the file* here because
|
||||
* its usage count has been increased by the caller of this function.
|
||||
*/
|
||||
revents = ep_item_poll(epi, &pt);
|
||||
revents = ep_item_poll(epi, &pt, 1);
|
||||
|
||||
/*
|
||||
* If the item is "hot" and it is not registered inside the ready
|
||||
|
|
@ -1674,7 +1654,7 @@ static int ep_send_events_proc(struct eventpoll *ep, struct list_head *head,
|
|||
|
||||
list_del_init(&epi->rdllink);
|
||||
|
||||
revents = ep_item_poll(epi, &pt);
|
||||
revents = ep_item_poll(epi, &pt, 1);
|
||||
|
||||
/*
|
||||
* If the event mask intersect the caller-requested one,
|
||||
|
|
@ -2313,11 +2293,10 @@ static int __init eventpoll_init(void)
|
|||
*/
|
||||
ep_nested_calls_init(&poll_loop_ncalls);
|
||||
|
||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||
/* Initialize the structure used to perform safe poll wait head wake ups */
|
||||
ep_nested_calls_init(&poll_safewake_ncalls);
|
||||
|
||||
/* Initialize the structure used to perform file's f_op->poll() calls */
|
||||
ep_nested_calls_init(&poll_readywalk_ncalls);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We can have many thousands of epitems, so prevent this from
|
||||
|
|
@ -2327,11 +2306,11 @@ static int __init eventpoll_init(void)
|
|||
|
||||
/* Allocates slab cache used to allocate "struct epitem" items */
|
||||
epi_cache = kmem_cache_create("eventpoll_epi", sizeof(struct epitem),
|
||||
0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);
|
||||
0, SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL);
|
||||
|
||||
/* Allocates slab cache used to allocate "struct eppoll_entry" */
|
||||
pwq_cache = kmem_cache_create("eventpoll_pwq",
|
||||
sizeof(struct eppoll_entry), 0, SLAB_PANIC, NULL);
|
||||
sizeof(struct eppoll_entry), 0, SLAB_PANIC|SLAB_ACCOUNT, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue