From patchwork Tue Nov 1 23:04:36 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cong Wang X-Patchwork-Id: 690216 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3t7mys5zTvz9t3K for ; Wed, 2 Nov 2016 10:04:53 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=mBEvK/AX; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753980AbcKAXEt (ORCPT ); Tue, 1 Nov 2016 19:04:49 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:36267 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753037AbcKAXEr (ORCPT ); Tue, 1 Nov 2016 19:04:47 -0400 Received: by mail-pf0-f196.google.com with SMTP id n85so12790525pfi.3 for ; Tue, 01 Nov 2016 16:04:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=8Fl/vNEO2LkVaXcOVVNOZ7FfxbBVQjFWL7HRz0C9AV8=; b=mBEvK/AXB5Okjolxc5rQCr1DJM49D+KbiV800NuHQAPAaJiYYzgh/K8bTOuHKyzXRw m49xnHHMMLNd8ySUnTEbSETy5C9v+exfd71Unb9zifS5iFmA19Uzm2v3oR1fjY5SIe1U ioP/w5yrPDkcqEmN/ZN1Hwif0329J1pSgps7DXW/7wLLG98CR+kYtDfh7a+UQbxHc/mb crS6pIyrjggddRuKCh2LHw9tpp2DLnimvK2bed8SUKct0oKeFU9zvB4K77s4nQTPL4Wo WLPggAY6Gju7Ll+PI08TQ33SirMYrGYoVfLzJZ6dooRa0VQ47JbKoDXmxTWWoO93GDU7 sfoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=8Fl/vNEO2LkVaXcOVVNOZ7FfxbBVQjFWL7HRz0C9AV8=; b=B4JaeyeLyxdyTb3HZHT6c3gR+npTYn4VjSHDuStIudClKKGOSHgqe/aD2V3cLMsLUy N8o/964Norgi1lQFjIH3vJmw8aBvOq7SAh53CL5zUO2HHs5GBFIQsBPLu2RfkaXEzJth xcgRkgrIpfLX8MnwC0Ixf2fEwYyoyCJ/Y7HUjC1IU4J3mspLMRQwAlmHOwUwPrBNFE5Z HgZgG0gZL6Z3iRpQvHMUlbE9PKmxHqpRQjWflXGELBEGLjhllf5Us9mDloW5mFaQzFFJ 42vbKBvtlbIGIyH0jyQ01+q2YBE+AlKODwdvfSdyevd8Pd9CUJps3sB4EJCYr933XNF6 X0iw== X-Gm-Message-State: ABUngvf0umAXdkF7IWx+0/ouwEoqE2XkIYmoPoNzGZ8BiE6HwvNqu6185DJ88WzMuut0Lw== X-Received: by 10.98.196.89 with SMTP id y86mr874961pff.172.1478041487112; Tue, 01 Nov 2016 16:04:47 -0700 (PDT) Received: from localhost.net ([8.25.197.24]) by smtp.gmail.com with ESMTPSA id x1sm44668449pax.7.2016.11.01.16.04.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 01 Nov 2016 16:04:46 -0700 (PDT) From: Cong Wang To: netdev@vger.kernel.org Cc: Cong Wang , Andrey Konovalov , Eric Dumazet , Peter Zijlstra Subject: [Patch net] inet: fix sleeping inside inet_wait_for_connect() Date: Tue, 1 Nov 2016 16:04:36 -0700 Message-Id: <1478041476-5568-1-git-send-email-xiyou.wangcong@gmail.com> X-Mailer: git-send-email 2.1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Andrey reported this kernel warning: WARNING: CPU: 0 PID: 4608 at kernel/sched/core.c:7724 __might_sleep+0x14c/0x1a0 kernel/sched/core.c:7719 do not call blocking ops when !TASK_RUNNING; state=1 set at [] prepare_to_wait+0xbc/0x210 kernel/sched/wait.c:178 Modules linked in: CPU: 0 PID: 4608 Comm: syz-executor Not tainted 4.9.0-rc2+ #320 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 ffff88006625f7a0 ffffffff81b46914 ffff88006625f818 0000000000000000 ffffffff84052960 0000000000000000 ffff88006625f7e8 ffffffff81111237 ffff88006aceac00 ffffffff00001e2c ffffed000cc4beff ffffffff84052960 Call Trace: [< inline >] __dump_stack lib/dump_stack.c:15 [] dump_stack+0xb3/0x10f lib/dump_stack.c:51 [] __warn+0x1a7/0x1f0 kernel/panic.c:550 [] warn_slowpath_fmt+0xac/0xd0 kernel/panic.c:565 [] __might_sleep+0x14c/0x1a0 kernel/sched/core.c:7719 [< inline >] slab_pre_alloc_hook mm/slab.h:393 [< inline >] slab_alloc_node mm/slub.c:2634 [< inline >] slab_alloc mm/slub.c:2716 [] __kmalloc_track_caller+0x150/0x2a0 mm/slub.c:4240 [] kmemdup+0x24/0x50 mm/util.c:113 [] dccp_feat_clone_sp_val.part.5+0x4f/0xe0 net/dccp/feat.c:374 [< inline >] dccp_feat_clone_sp_val net/dccp/feat.c:1141 [< inline >] dccp_feat_change_recv net/dccp/feat.c:1141 [] dccp_feat_parse_options+0xaa1/0x13d0 net/dccp/feat.c:1411 [] dccp_parse_options+0x721/0x1010 net/dccp/options.c:128 [] dccp_rcv_state_process+0x200/0x15b0 net/dccp/input.c:644 [] dccp_v4_do_rcv+0xf4/0x1a0 net/dccp/ipv4.c:681 [< inline >] sk_backlog_rcv ./include/net/sock.h:872 [] __release_sock+0x126/0x3a0 net/core/sock.c:2044 [] release_sock+0x59/0x1c0 net/core/sock.c:2502 [< inline >] inet_wait_for_connect net/ipv4/af_inet.c:547 [] __inet_stream_connect+0x5d2/0xbb0 net/ipv4/af_inet.c:617 [] inet_stream_connect+0x55/0xa0 net/ipv4/af_inet.c:656 [] SYSC_connect+0x244/0x2f0 net/socket.c:1533 [] SyS_connect+0x24/0x30 net/socket.c:1514 [] entry_SYSCALL_64_fastpath+0x1f/0xc2 arch/x86/entry/entry_64.S:209 Unlike commit 26cabd31259ba43f68026ce3f62b78094124333f ("sched, net: Clean up sk_wait_event() vs. might_sleep()"), the sleeping function is called before schedule_timeout(), this is indeed a bug. Fix this by moving the wait logic to the new API, it is similar to commit ff960a731788a7408b6f66ec4fd772ff18833211 ("netdev, sched/wait: Fix sleeping inside wait event"). Reported-by: Andrey Konovalov Cc: Andrey Konovalov Cc: Eric Dumazet Cc: Peter Zijlstra Signed-off-by: Cong Wang --- net/ipv4/af_inet.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 9648c97..5ddf5cd 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -533,9 +533,9 @@ EXPORT_SYMBOL(inet_dgram_connect); static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias) { - DEFINE_WAIT(wait); + DEFINE_WAIT_FUNC(wait, woken_wake_function); - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); + add_wait_queue(sk_sleep(sk), &wait); sk->sk_write_pending += writebias; /* Basic assumption: if someone sets sk->sk_err, he _must_ @@ -545,13 +545,12 @@ static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias) */ while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { release_sock(sk); - timeo = schedule_timeout(timeo); + timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo); lock_sock(sk); if (signal_pending(current) || !timeo) break; - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); } - finish_wait(sk_sleep(sk), &wait); + remove_wait_queue(sk_sleep(sk), &wait); sk->sk_write_pending -= writebias; return timeo; }