diff options
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/netpoll.c | 8 | ||||
| -rw-r--r-- | net/core/pktgen.c | 2 | ||||
| -rw-r--r-- | net/core/scm.c | 3 |
3 files changed, 4 insertions, 9 deletions
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index d1264e9a50a8..de1b26aa5720 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -124,13 +124,6 @@ static void poll_napi(struct netpoll *np) | |||
| 124 | if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) && | 124 | if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) && |
| 125 | npinfo->poll_owner != smp_processor_id() && | 125 | npinfo->poll_owner != smp_processor_id() && |
| 126 | spin_trylock(&npinfo->poll_lock)) { | 126 | spin_trylock(&npinfo->poll_lock)) { |
| 127 | /* When calling dev->poll from poll_napi, we may end up in | ||
| 128 | * netif_rx_complete. However, only the CPU to which the | ||
| 129 | * device was queued is allowed to remove it from poll_list. | ||
| 130 | * Setting POLL_LIST_FROZEN tells netif_rx_complete | ||
| 131 | * to leave the NAPI state alone. | ||
| 132 | */ | ||
| 133 | set_bit(__LINK_STATE_POLL_LIST_FROZEN, &np->dev->state); | ||
| 134 | npinfo->rx_flags |= NETPOLL_RX_DROP; | 127 | npinfo->rx_flags |= NETPOLL_RX_DROP; |
| 135 | atomic_inc(&trapped); | 128 | atomic_inc(&trapped); |
| 136 | 129 | ||
| @@ -138,7 +131,6 @@ static void poll_napi(struct netpoll *np) | |||
| 138 | 131 | ||
| 139 | atomic_dec(&trapped); | 132 | atomic_dec(&trapped); |
| 140 | npinfo->rx_flags &= ~NETPOLL_RX_DROP; | 133 | npinfo->rx_flags &= ~NETPOLL_RX_DROP; |
| 141 | clear_bit(__LINK_STATE_POLL_LIST_FROZEN, &np->dev->state); | ||
| 142 | spin_unlock(&npinfo->poll_lock); | 134 | spin_unlock(&npinfo->poll_lock); |
| 143 | } | 135 | } |
| 144 | } | 136 | } |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 75215331b045..bca787fdbc51 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -3465,6 +3465,8 @@ static int pktgen_thread_worker(void *arg) | |||
| 3465 | 3465 | ||
| 3466 | set_current_state(TASK_INTERRUPTIBLE); | 3466 | set_current_state(TASK_INTERRUPTIBLE); |
| 3467 | 3467 | ||
| 3468 | set_freezable(); | ||
| 3469 | |||
| 3468 | while (!kthread_should_stop()) { | 3470 | while (!kthread_should_stop()) { |
| 3469 | pkt_dev = next_to_run(t); | 3471 | pkt_dev = next_to_run(t); |
| 3470 | 3472 | ||
diff --git a/net/core/scm.c b/net/core/scm.c index 292ad8d5ad76..44c4ec2c8769 100644 --- a/net/core/scm.c +++ b/net/core/scm.c | |||
| @@ -228,7 +228,8 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm) | |||
| 228 | err = security_file_receive(fp[i]); | 228 | err = security_file_receive(fp[i]); |
| 229 | if (err) | 229 | if (err) |
| 230 | break; | 230 | break; |
| 231 | err = get_unused_fd(); | 231 | err = get_unused_fd_flags(MSG_CMSG_CLOEXEC & msg->msg_flags |
| 232 | ? O_CLOEXEC : 0); | ||
| 232 | if (err < 0) | 233 | if (err < 0) |
| 233 | break; | 234 | break; |
| 234 | new_fd = err; | 235 | new_fd = err; |
