diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
| commit | 1f16f116b01c110db20ab808562c8b8bc3ee3d6e (patch) | |
| tree | 44db563f64cf5f8d62af8f99a61e2b248c44ea3a /net/core | |
| parent | 03724ac3d48f8f0e3caf1d30fa134f8fd96c94e2 (diff) | |
| parent | f9eccf24615672896dc13251410c3f2f33a14f95 (diff) | |
Merge branches 'clockevents/4.4-fixes' and 'clockevents/4.5-fixes' of http://git.linaro.org/people/daniel.lezcano/linux into timers/urgent
Pull in fixes from Daniel Lezcano:
- Fix the vt8500 timer leading to a system lock up when dealing with too
small delta (Roman Volkov)
- Select the CLKSRC_MMIO when the fsl_ftm_timer is enabled with COMPILE_TEST
(Daniel Lezcano)
- Prevent to compile timers using the 'iomem' API when the architecture has
not HAS_IOMEM set (Richard Weinberger)
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/datagram.c | 2 | ||||
| -rw-r--r-- | net/core/neighbour.c | 4 | ||||
| -rw-r--r-- | net/core/netclassid_cgroup.c | 28 | ||||
| -rw-r--r-- | net/core/netprio_cgroup.c | 9 | ||||
| -rw-r--r-- | net/core/scm.c | 2 | ||||
| -rw-r--r-- | net/core/skbuff.c | 5 | ||||
| -rw-r--r-- | net/core/sock.c | 19 | ||||
| -rw-r--r-- | net/core/stream.c | 6 |
8 files changed, 44 insertions, 31 deletions
diff --git a/net/core/datagram.c b/net/core/datagram.c index 617088aee21d..d62af69ad844 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
| @@ -785,7 +785,7 @@ unsigned int datagram_poll(struct file *file, struct socket *sock, | |||
| 785 | if (sock_writeable(sk)) | 785 | if (sock_writeable(sk)) |
| 786 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; | 786 | mask |= POLLOUT | POLLWRNORM | POLLWRBAND; |
| 787 | else | 787 | else |
| 788 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 788 | sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
| 789 | 789 | ||
| 790 | return mask; | 790 | return mask; |
| 791 | } | 791 | } |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index e6af42da28d9..f18ae91b652e 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -2215,7 +2215,7 @@ static int pneigh_fill_info(struct sk_buff *skb, struct pneigh_entry *pn, | |||
| 2215 | ndm->ndm_pad2 = 0; | 2215 | ndm->ndm_pad2 = 0; |
| 2216 | ndm->ndm_flags = pn->flags | NTF_PROXY; | 2216 | ndm->ndm_flags = pn->flags | NTF_PROXY; |
| 2217 | ndm->ndm_type = RTN_UNICAST; | 2217 | ndm->ndm_type = RTN_UNICAST; |
| 2218 | ndm->ndm_ifindex = pn->dev->ifindex; | 2218 | ndm->ndm_ifindex = pn->dev ? pn->dev->ifindex : 0; |
| 2219 | ndm->ndm_state = NUD_NONE; | 2219 | ndm->ndm_state = NUD_NONE; |
| 2220 | 2220 | ||
| 2221 | if (nla_put(skb, NDA_DST, tbl->key_len, pn->key)) | 2221 | if (nla_put(skb, NDA_DST, tbl->key_len, pn->key)) |
| @@ -2333,7 +2333,7 @@ static int pneigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb, | |||
| 2333 | if (h > s_h) | 2333 | if (h > s_h) |
| 2334 | s_idx = 0; | 2334 | s_idx = 0; |
| 2335 | for (n = tbl->phash_buckets[h], idx = 0; n; n = n->next) { | 2335 | for (n = tbl->phash_buckets[h], idx = 0; n; n = n->next) { |
| 2336 | if (dev_net(n->dev) != net) | 2336 | if (pneigh_net(n) != net) |
| 2337 | continue; | 2337 | continue; |
| 2338 | if (idx < s_idx) | 2338 | if (idx < s_idx) |
| 2339 | goto next; | 2339 | goto next; |
diff --git a/net/core/netclassid_cgroup.c b/net/core/netclassid_cgroup.c index 6441f47b1a8f..d9ee8d08a3a6 100644 --- a/net/core/netclassid_cgroup.c +++ b/net/core/netclassid_cgroup.c | |||
| @@ -56,7 +56,7 @@ static void cgrp_css_free(struct cgroup_subsys_state *css) | |||
| 56 | kfree(css_cls_state(css)); | 56 | kfree(css_cls_state(css)); |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | static int update_classid(const void *v, struct file *file, unsigned n) | 59 | static int update_classid_sock(const void *v, struct file *file, unsigned n) |
| 60 | { | 60 | { |
| 61 | int err; | 61 | int err; |
| 62 | struct socket *sock = sock_from_file(file, &err); | 62 | struct socket *sock = sock_from_file(file, &err); |
| @@ -67,18 +67,27 @@ static int update_classid(const void *v, struct file *file, unsigned n) | |||
| 67 | return 0; | 67 | return 0; |
| 68 | } | 68 | } |
| 69 | 69 | ||
| 70 | static void cgrp_attach(struct cgroup_subsys_state *css, | 70 | static void update_classid(struct cgroup_subsys_state *css, void *v) |
| 71 | struct cgroup_taskset *tset) | ||
| 72 | { | 71 | { |
| 73 | struct cgroup_cls_state *cs = css_cls_state(css); | 72 | struct css_task_iter it; |
| 74 | void *v = (void *)(unsigned long)cs->classid; | ||
| 75 | struct task_struct *p; | 73 | struct task_struct *p; |
| 76 | 74 | ||
| 77 | cgroup_taskset_for_each(p, tset) { | 75 | css_task_iter_start(css, &it); |
| 76 | while ((p = css_task_iter_next(&it))) { | ||
| 78 | task_lock(p); | 77 | task_lock(p); |
| 79 | iterate_fd(p->files, 0, update_classid, v); | 78 | iterate_fd(p->files, 0, update_classid_sock, v); |
| 80 | task_unlock(p); | 79 | task_unlock(p); |
| 81 | } | 80 | } |
| 81 | css_task_iter_end(&it); | ||
| 82 | } | ||
| 83 | |||
| 84 | static void cgrp_attach(struct cgroup_taskset *tset) | ||
| 85 | { | ||
| 86 | struct cgroup_subsys_state *css; | ||
| 87 | |||
| 88 | cgroup_taskset_first(tset, &css); | ||
| 89 | update_classid(css, | ||
| 90 | (void *)(unsigned long)css_cls_state(css)->classid); | ||
| 82 | } | 91 | } |
| 83 | 92 | ||
| 84 | static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) | 93 | static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) |
| @@ -89,8 +98,11 @@ static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) | |||
| 89 | static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft, | 98 | static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft, |
| 90 | u64 value) | 99 | u64 value) |
| 91 | { | 100 | { |
| 92 | css_cls_state(css)->classid = (u32) value; | 101 | struct cgroup_cls_state *cs = css_cls_state(css); |
| 102 | |||
| 103 | cs->classid = (u32)value; | ||
| 93 | 104 | ||
| 105 | update_classid(css, (void *)(unsigned long)cs->classid); | ||
| 94 | return 0; | 106 | return 0; |
| 95 | } | 107 | } |
| 96 | 108 | ||
diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c index cbd0a199bf52..40fd09fe06ae 100644 --- a/net/core/netprio_cgroup.c +++ b/net/core/netprio_cgroup.c | |||
| @@ -218,13 +218,14 @@ static int update_netprio(const void *v, struct file *file, unsigned n) | |||
| 218 | return 0; | 218 | return 0; |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | static void net_prio_attach(struct cgroup_subsys_state *css, | 221 | static void net_prio_attach(struct cgroup_taskset *tset) |
| 222 | struct cgroup_taskset *tset) | ||
| 223 | { | 222 | { |
| 224 | struct task_struct *p; | 223 | struct task_struct *p; |
| 225 | void *v = (void *)(unsigned long)css->cgroup->id; | 224 | struct cgroup_subsys_state *css; |
| 225 | |||
| 226 | cgroup_taskset_for_each(p, css, tset) { | ||
| 227 | void *v = (void *)(unsigned long)css->cgroup->id; | ||
| 226 | 228 | ||
| 227 | cgroup_taskset_for_each(p, tset) { | ||
| 228 | task_lock(p); | 229 | task_lock(p); |
| 229 | iterate_fd(p->files, 0, update_netprio, v); | 230 | iterate_fd(p->files, 0, update_netprio, v); |
| 230 | task_unlock(p); | 231 | task_unlock(p); |
diff --git a/net/core/scm.c b/net/core/scm.c index 3b6899b7d810..8a1741b14302 100644 --- a/net/core/scm.c +++ b/net/core/scm.c | |||
| @@ -305,6 +305,8 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm) | |||
| 305 | err = put_user(cmlen, &cm->cmsg_len); | 305 | err = put_user(cmlen, &cm->cmsg_len); |
| 306 | if (!err) { | 306 | if (!err) { |
| 307 | cmlen = CMSG_SPACE(i*sizeof(int)); | 307 | cmlen = CMSG_SPACE(i*sizeof(int)); |
| 308 | if (msg->msg_controllen < cmlen) | ||
| 309 | cmlen = msg->msg_controllen; | ||
| 308 | msg->msg_control += cmlen; | 310 | msg->msg_control += cmlen; |
| 309 | msg->msg_controllen -= cmlen; | 311 | msg->msg_controllen -= cmlen; |
| 310 | } | 312 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 152b9c70e252..b2df375ec9c2 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -3643,7 +3643,8 @@ static void __skb_complete_tx_timestamp(struct sk_buff *skb, | |||
| 3643 | serr->ee.ee_info = tstype; | 3643 | serr->ee.ee_info = tstype; |
| 3644 | if (sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) { | 3644 | if (sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) { |
| 3645 | serr->ee.ee_data = skb_shinfo(skb)->tskey; | 3645 | serr->ee.ee_data = skb_shinfo(skb)->tskey; |
| 3646 | if (sk->sk_protocol == IPPROTO_TCP) | 3646 | if (sk->sk_protocol == IPPROTO_TCP && |
| 3647 | sk->sk_type == SOCK_STREAM) | ||
| 3647 | serr->ee.ee_data -= sk->sk_tskey; | 3648 | serr->ee.ee_data -= sk->sk_tskey; |
| 3648 | } | 3649 | } |
| 3649 | 3650 | ||
| @@ -4268,7 +4269,7 @@ static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb) | |||
| 4268 | return NULL; | 4269 | return NULL; |
| 4269 | } | 4270 | } |
| 4270 | 4271 | ||
| 4271 | memmove(skb->data - ETH_HLEN, skb->data - skb->mac_len, | 4272 | memmove(skb->data - ETH_HLEN, skb->data - skb->mac_len - VLAN_HLEN, |
| 4272 | 2 * ETH_ALEN); | 4273 | 2 * ETH_ALEN); |
| 4273 | skb->mac_header += VLAN_HLEN; | 4274 | skb->mac_header += VLAN_HLEN; |
| 4274 | return skb; | 4275 | return skb; |
diff --git a/net/core/sock.c b/net/core/sock.c index 1e4dd54bfb5a..0d91f7dca751 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -433,8 +433,6 @@ static bool sock_needs_netstamp(const struct sock *sk) | |||
| 433 | } | 433 | } |
| 434 | } | 434 | } |
| 435 | 435 | ||
| 436 | #define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE)) | ||
| 437 | |||
| 438 | static void sock_disable_timestamp(struct sock *sk, unsigned long flags) | 436 | static void sock_disable_timestamp(struct sock *sk, unsigned long flags) |
| 439 | { | 437 | { |
| 440 | if (sk->sk_flags & flags) { | 438 | if (sk->sk_flags & flags) { |
| @@ -874,7 +872,8 @@ set_rcvbuf: | |||
| 874 | 872 | ||
| 875 | if (val & SOF_TIMESTAMPING_OPT_ID && | 873 | if (val & SOF_TIMESTAMPING_OPT_ID && |
| 876 | !(sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)) { | 874 | !(sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)) { |
| 877 | if (sk->sk_protocol == IPPROTO_TCP) { | 875 | if (sk->sk_protocol == IPPROTO_TCP && |
| 876 | sk->sk_type == SOCK_STREAM) { | ||
| 878 | if (sk->sk_state != TCP_ESTABLISHED) { | 877 | if (sk->sk_state != TCP_ESTABLISHED) { |
| 879 | ret = -EINVAL; | 878 | ret = -EINVAL; |
| 880 | break; | 879 | break; |
| @@ -1530,7 +1529,6 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) | |||
| 1530 | skb_queue_head_init(&newsk->sk_receive_queue); | 1529 | skb_queue_head_init(&newsk->sk_receive_queue); |
| 1531 | skb_queue_head_init(&newsk->sk_write_queue); | 1530 | skb_queue_head_init(&newsk->sk_write_queue); |
| 1532 | 1531 | ||
| 1533 | spin_lock_init(&newsk->sk_dst_lock); | ||
| 1534 | rwlock_init(&newsk->sk_callback_lock); | 1532 | rwlock_init(&newsk->sk_callback_lock); |
| 1535 | lockdep_set_class_and_name(&newsk->sk_callback_lock, | 1533 | lockdep_set_class_and_name(&newsk->sk_callback_lock, |
| 1536 | af_callback_keys + newsk->sk_family, | 1534 | af_callback_keys + newsk->sk_family, |
| @@ -1553,7 +1551,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) | |||
| 1553 | */ | 1551 | */ |
| 1554 | is_charged = sk_filter_charge(newsk, filter); | 1552 | is_charged = sk_filter_charge(newsk, filter); |
| 1555 | 1553 | ||
| 1556 | if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk))) { | 1554 | if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk, sk))) { |
| 1557 | /* It is still raw copy of parent, so invalidate | 1555 | /* It is still raw copy of parent, so invalidate |
| 1558 | * destructor and make plain sk_free() */ | 1556 | * destructor and make plain sk_free() */ |
| 1559 | newsk->sk_destruct = NULL; | 1557 | newsk->sk_destruct = NULL; |
| @@ -1607,7 +1605,7 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst) | |||
| 1607 | { | 1605 | { |
| 1608 | u32 max_segs = 1; | 1606 | u32 max_segs = 1; |
| 1609 | 1607 | ||
| 1610 | __sk_dst_set(sk, dst); | 1608 | sk_dst_set(sk, dst); |
| 1611 | sk->sk_route_caps = dst->dev->features; | 1609 | sk->sk_route_caps = dst->dev->features; |
| 1612 | if (sk->sk_route_caps & NETIF_F_GSO) | 1610 | if (sk->sk_route_caps & NETIF_F_GSO) |
| 1613 | sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE; | 1611 | sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE; |
| @@ -1815,7 +1813,7 @@ static long sock_wait_for_wmem(struct sock *sk, long timeo) | |||
| 1815 | { | 1813 | { |
| 1816 | DEFINE_WAIT(wait); | 1814 | DEFINE_WAIT(wait); |
| 1817 | 1815 | ||
| 1818 | clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 1816 | sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
| 1819 | for (;;) { | 1817 | for (;;) { |
| 1820 | if (!timeo) | 1818 | if (!timeo) |
| 1821 | break; | 1819 | break; |
| @@ -1861,7 +1859,7 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len, | |||
| 1861 | if (sk_wmem_alloc_get(sk) < sk->sk_sndbuf) | 1859 | if (sk_wmem_alloc_get(sk) < sk->sk_sndbuf) |
| 1862 | break; | 1860 | break; |
| 1863 | 1861 | ||
| 1864 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 1862 | sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
| 1865 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); | 1863 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); |
| 1866 | err = -EAGAIN; | 1864 | err = -EAGAIN; |
| 1867 | if (!timeo) | 1865 | if (!timeo) |
| @@ -2048,9 +2046,9 @@ int sk_wait_data(struct sock *sk, long *timeo, const struct sk_buff *skb) | |||
| 2048 | DEFINE_WAIT(wait); | 2046 | DEFINE_WAIT(wait); |
| 2049 | 2047 | ||
| 2050 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); | 2048 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
| 2051 | set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); | 2049 | sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); |
| 2052 | rc = sk_wait_event(sk, timeo, skb_peek_tail(&sk->sk_receive_queue) != skb); | 2050 | rc = sk_wait_event(sk, timeo, skb_peek_tail(&sk->sk_receive_queue) != skb); |
| 2053 | clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); | 2051 | sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk); |
| 2054 | finish_wait(sk_sleep(sk), &wait); | 2052 | finish_wait(sk_sleep(sk), &wait); |
| 2055 | return rc; | 2053 | return rc; |
| 2056 | } | 2054 | } |
| @@ -2388,7 +2386,6 @@ void sock_init_data(struct socket *sock, struct sock *sk) | |||
| 2388 | } else | 2386 | } else |
| 2389 | sk->sk_wq = NULL; | 2387 | sk->sk_wq = NULL; |
| 2390 | 2388 | ||
| 2391 | spin_lock_init(&sk->sk_dst_lock); | ||
| 2392 | rwlock_init(&sk->sk_callback_lock); | 2389 | rwlock_init(&sk->sk_callback_lock); |
| 2393 | lockdep_set_class_and_name(&sk->sk_callback_lock, | 2390 | lockdep_set_class_and_name(&sk->sk_callback_lock, |
| 2394 | af_callback_keys + sk->sk_family, | 2391 | af_callback_keys + sk->sk_family, |
diff --git a/net/core/stream.c b/net/core/stream.c index d70f77a0c889..b96f7a79e544 100644 --- a/net/core/stream.c +++ b/net/core/stream.c | |||
| @@ -39,7 +39,7 @@ void sk_stream_write_space(struct sock *sk) | |||
| 39 | wake_up_interruptible_poll(&wq->wait, POLLOUT | | 39 | wake_up_interruptible_poll(&wq->wait, POLLOUT | |
| 40 | POLLWRNORM | POLLWRBAND); | 40 | POLLWRNORM | POLLWRBAND); |
| 41 | if (wq && wq->fasync_list && !(sk->sk_shutdown & SEND_SHUTDOWN)) | 41 | if (wq && wq->fasync_list && !(sk->sk_shutdown & SEND_SHUTDOWN)) |
| 42 | sock_wake_async(sock, SOCK_WAKE_SPACE, POLL_OUT); | 42 | sock_wake_async(wq, SOCK_WAKE_SPACE, POLL_OUT); |
| 43 | rcu_read_unlock(); | 43 | rcu_read_unlock(); |
| 44 | } | 44 | } |
| 45 | } | 45 | } |
| @@ -126,7 +126,7 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p) | |||
| 126 | current_timeo = vm_wait = (prandom_u32() % (HZ / 5)) + 2; | 126 | current_timeo = vm_wait = (prandom_u32() % (HZ / 5)) + 2; |
| 127 | 127 | ||
| 128 | while (1) { | 128 | while (1) { |
| 129 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 129 | sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
| 130 | 130 | ||
| 131 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); | 131 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
| 132 | 132 | ||
| @@ -139,7 +139,7 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p) | |||
| 139 | } | 139 | } |
| 140 | if (signal_pending(current)) | 140 | if (signal_pending(current)) |
| 141 | goto do_interrupted; | 141 | goto do_interrupted; |
| 142 | clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 142 | sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
| 143 | if (sk_stream_memory_free(sk) && !vm_wait) | 143 | if (sk_stream_memory_free(sk) && !vm_wait) |
| 144 | break; | 144 | break; |
| 145 | 145 | ||
