|
@@ -53,8 +53,8 @@ void sk_stream_write_space(struct sock *sk)
|
|
*/
|
|
*/
|
|
int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
|
|
int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
|
|
{
|
|
{
|
|
|
|
+ DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
|
struct task_struct *tsk = current;
|
|
struct task_struct *tsk = current;
|
|
- DEFINE_WAIT(wait);
|
|
|
|
int done;
|
|
int done;
|
|
|
|
|
|
do {
|
|
do {
|
|
@@ -68,13 +68,13 @@ int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
|
|
if (signal_pending(tsk))
|
|
if (signal_pending(tsk))
|
|
return sock_intr_errno(*timeo_p);
|
|
return sock_intr_errno(*timeo_p);
|
|
|
|
|
|
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
|
|
|
|
|
+ add_wait_queue(sk_sleep(sk), &wait);
|
|
sk->sk_write_pending++;
|
|
sk->sk_write_pending++;
|
|
done = sk_wait_event(sk, timeo_p,
|
|
done = sk_wait_event(sk, timeo_p,
|
|
!sk->sk_err &&
|
|
!sk->sk_err &&
|
|
!((1 << sk->sk_state) &
|
|
!((1 << sk->sk_state) &
|
|
- ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)));
|
|
|
|
- finish_wait(sk_sleep(sk), &wait);
|
|
|
|
|
|
+ ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)), &wait);
|
|
|
|
+ remove_wait_queue(sk_sleep(sk), &wait);
|
|
sk->sk_write_pending--;
|
|
sk->sk_write_pending--;
|
|
} while (!done);
|
|
} while (!done);
|
|
return 0;
|
|
return 0;
|
|
@@ -94,16 +94,16 @@ static inline int sk_stream_closing(struct sock *sk)
|
|
void sk_stream_wait_close(struct sock *sk, long timeout)
|
|
void sk_stream_wait_close(struct sock *sk, long timeout)
|
|
{
|
|
{
|
|
if (timeout) {
|
|
if (timeout) {
|
|
- DEFINE_WAIT(wait);
|
|
|
|
|
|
+ DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
|
|
|
+
|
|
|
|
+ add_wait_queue(sk_sleep(sk), &wait);
|
|
|
|
|
|
do {
|
|
do {
|
|
- prepare_to_wait(sk_sleep(sk), &wait,
|
|
|
|
- TASK_INTERRUPTIBLE);
|
|
|
|
- if (sk_wait_event(sk, &timeout, !sk_stream_closing(sk)))
|
|
|
|
|
|
+ if (sk_wait_event(sk, &timeout, !sk_stream_closing(sk), &wait))
|
|
break;
|
|
break;
|
|
} while (!signal_pending(current) && timeout);
|
|
} while (!signal_pending(current) && timeout);
|
|
|
|
|
|
- finish_wait(sk_sleep(sk), &wait);
|
|
|
|
|
|
+ remove_wait_queue(sk_sleep(sk), &wait);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(sk_stream_wait_close);
|
|
EXPORT_SYMBOL(sk_stream_wait_close);
|
|
@@ -119,16 +119,16 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
|
|
long vm_wait = 0;
|
|
long vm_wait = 0;
|
|
long current_timeo = *timeo_p;
|
|
long current_timeo = *timeo_p;
|
|
bool noblock = (*timeo_p ? false : true);
|
|
bool noblock = (*timeo_p ? false : true);
|
|
- DEFINE_WAIT(wait);
|
|
|
|
|
|
+ DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
|
|
|
|
|
if (sk_stream_memory_free(sk))
|
|
if (sk_stream_memory_free(sk))
|
|
current_timeo = vm_wait = (prandom_u32() % (HZ / 5)) + 2;
|
|
current_timeo = vm_wait = (prandom_u32() % (HZ / 5)) + 2;
|
|
|
|
|
|
|
|
+ add_wait_queue(sk_sleep(sk), &wait);
|
|
|
|
+
|
|
while (1) {
|
|
while (1) {
|
|
sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
|
|
sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
|
|
|
|
|
|
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
|
|
|
-
|
|
|
|
if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
|
|
if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
|
|
goto do_error;
|
|
goto do_error;
|
|
if (!*timeo_p) {
|
|
if (!*timeo_p) {
|
|
@@ -147,7 +147,7 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
|
|
sk_wait_event(sk, ¤t_timeo, sk->sk_err ||
|
|
sk_wait_event(sk, ¤t_timeo, sk->sk_err ||
|
|
(sk->sk_shutdown & SEND_SHUTDOWN) ||
|
|
(sk->sk_shutdown & SEND_SHUTDOWN) ||
|
|
(sk_stream_memory_free(sk) &&
|
|
(sk_stream_memory_free(sk) &&
|
|
- !vm_wait));
|
|
|
|
|
|
+ !vm_wait), &wait);
|
|
sk->sk_write_pending--;
|
|
sk->sk_write_pending--;
|
|
|
|
|
|
if (vm_wait) {
|
|
if (vm_wait) {
|
|
@@ -161,7 +161,7 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
|
|
*timeo_p = current_timeo;
|
|
*timeo_p = current_timeo;
|
|
}
|
|
}
|
|
out:
|
|
out:
|
|
- finish_wait(sk_sleep(sk), &wait);
|
|
|
|
|
|
+ remove_wait_queue(sk_sleep(sk), &wait);
|
|
return err;
|
|
return err;
|
|
|
|
|
|
do_error:
|
|
do_error:
|