mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
Revert changes to convert to ->poll_mask() and aio IOCB_CMD_POLL
The poll() changes were not well thought out, and completely unexplained. They also caused a huge performance regression, because "->poll()" was no longer a trivial file operation that just called down to the underlying file operations, but instead did at least two indirect calls. Indirect calls are sadly slow now with the Spectre mitigation, but the performance problem could at least be largely mitigated by changing the "->get_poll_head()" operation to just have a per-file-descriptor pointer to the poll head instead. That gets rid of one of the new indirections. But that doesn't fix the new complexity that is completely unwarranted for the regular case. The (undocumented) reason for the poll() changes was some alleged AIO poll race fixing, but we don't make the common case slower and more complex for some uncommon special case, so this all really needs way more explanations and most likely a fundamental redesign. [ This revert is a revert of about 30 different commits, not reverted individually because that would just be unnecessarily messy - Linus ] Cc: Al Viro <[email protected]> Cc: Christoph Hellwig <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
f57494321c
commit
a11e1d432b
80 changed files with 301 additions and 450 deletions
|
|
@ -316,7 +316,8 @@ int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
|
|||
int flags, int *addr_len);
|
||||
void dccp_shutdown(struct sock *sk, int how);
|
||||
int inet_dccp_listen(struct socket *sock, int backlog);
|
||||
__poll_t dccp_poll_mask(struct socket *sock, __poll_t events);
|
||||
__poll_t dccp_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait);
|
||||
int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
|
||||
void dccp_req_err(struct sock *sk, u64 seq);
|
||||
|
||||
|
|
|
|||
|
|
@ -984,7 +984,7 @@ static const struct proto_ops inet_dccp_ops = {
|
|||
.accept = inet_accept,
|
||||
.getname = inet_getname,
|
||||
/* FIXME: work on tcp_poll to rename it to inet_csk_poll */
|
||||
.poll_mask = dccp_poll_mask,
|
||||
.poll = dccp_poll,
|
||||
.ioctl = inet_ioctl,
|
||||
/* FIXME: work on inet_listen to rename it to sock_common_listen */
|
||||
.listen = inet_dccp_listen,
|
||||
|
|
|
|||
|
|
@ -1070,7 +1070,7 @@ static const struct proto_ops inet6_dccp_ops = {
|
|||
.socketpair = sock_no_socketpair,
|
||||
.accept = inet_accept,
|
||||
.getname = inet6_getname,
|
||||
.poll_mask = dccp_poll_mask,
|
||||
.poll = dccp_poll,
|
||||
.ioctl = inet6_ioctl,
|
||||
.listen = inet_dccp_listen,
|
||||
.shutdown = inet_shutdown,
|
||||
|
|
|
|||
|
|
@ -312,11 +312,20 @@ int dccp_disconnect(struct sock *sk, int flags)
|
|||
|
||||
EXPORT_SYMBOL_GPL(dccp_disconnect);
|
||||
|
||||
__poll_t dccp_poll_mask(struct socket *sock, __poll_t events)
|
||||
/*
|
||||
* Wait for a DCCP event.
|
||||
*
|
||||
* Note that we don't need to lock the socket, as the upper poll layers
|
||||
* take care of normal races (between the test and the event) and we don't
|
||||
* go look at any of the socket buffers directly.
|
||||
*/
|
||||
__poll_t dccp_poll(struct file *file, struct socket *sock,
|
||||
poll_table *wait)
|
||||
{
|
||||
__poll_t mask;
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
if (sk->sk_state == DCCP_LISTEN)
|
||||
return inet_csk_listen_poll(sk);
|
||||
|
||||
|
|
@ -358,7 +367,7 @@ __poll_t dccp_poll_mask(struct socket *sock, __poll_t events)
|
|||
return mask;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(dccp_poll_mask);
|
||||
EXPORT_SYMBOL_GPL(dccp_poll);
|
||||
|
||||
int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue