Received: by 2002:a25:c593:0:0:0:0:0 with SMTP id v141csp204308ybe; Sun, 1 Sep 2019 23:36:52 -0700 (PDT) X-Google-Smtp-Source: APXvYqyx8ww2dh+xFUYMFIwNvBrHodXIj9X0NAmVVDi/DCoYZBmlB4XnM1uhmTMGVrpbs2ePXWKI X-Received: by 2002:aa7:8756:: with SMTP id g22mr892327pfo.254.1567406212719; Sun, 01 Sep 2019 23:36:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567406212; cv=none; d=google.com; s=arc-20160816; b=hMfxNifC9G8RWLUPhSsa6z7vFrJ6InVav0ywJBjsHqssdhDIgLsCcwVRxtpXUHdrmZ 9EV62LWHwuRhe7/U0vBSDRPG9uhpU3R8RMGZwQZ/ORlimiqG2NquCa0bO4gZ/q0omX6M ZpjMt+SBiviZrJwiC0Y7kX5Mcliw93diy3ZKl0lfI3+X7CBbG6C2kx+O3KVGh+mQcZWW v1eyZ9DQeMMtJXZRpUkQUlkE3KZLv3EBOkZYLoOaMwKp1wiBDeCEJvhDPUk/XtRiGSD8 ST2YAKJbJQkBHXgtQ8DAy7LO9J01a3jkQs4Dc0uy61MEE6QTfTX6R40lOfqp4jq75CUJ yD8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=WNHOWN+0Coztu38fB5yaHQpPDHparb+VQPnzTlZJ0JE=; b=qBRaO4OdlCVvF5Zj2W0K4yrdXa5caK2+SUuw5JyFOyKFsz5dYoLWZjM/1BTJ5vpVZ6 P5WFU6Nz6E0GCTIVS79w2wSo2Q8WpQYZkLVJw4QppCSGm25To+RCCvQbtwmuhd0y7zU2 XCil5M3JKJR5OVuwQW8ZITgV7uIjCeB6rZJBJ8cXN6XDV5eEUQxKTbh+UVBkmZ7r6Fa3 f1wgaDnYjiZvUGsQHU5knC9dNTVyNIguQeWF3RwOI0bG2ZX/9mMXm5Xk1PWlNROqV5b8 UbD1XZQGyez5tL53uYKWeYf/IV9+z5qlqpHAvZu7opqKYBx30ULhMtjkonfntDhMNIkM Z8Cg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@hev-cc.20150623.gappssmtp.com header.s=20150623 header.b=qGL5ZUYG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y16si11396687plp.70.2019.09.01.23.36.35; Sun, 01 Sep 2019 23:36:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@hev-cc.20150623.gappssmtp.com header.s=20150623 header.b=qGL5ZUYG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729527AbfIBFVq (ORCPT + 99 others); Mon, 2 Sep 2019 01:21:46 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:36762 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726385AbfIBFVq (ORCPT ); Mon, 2 Sep 2019 01:21:46 -0400 Received: by mail-pf1-f193.google.com with SMTP id y22so2709783pfr.3 for ; Sun, 01 Sep 2019 22:21:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hev-cc.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=WNHOWN+0Coztu38fB5yaHQpPDHparb+VQPnzTlZJ0JE=; b=qGL5ZUYGDLtShp6IGgeoveuGqiflKyRIhYWTwSBVGkQ43dxoV3iFZnW5QpB5+Hlbz5 ICIVLCdmC8l3ZuZX8aGB3liCE2ieHjV6JDw0I79Z3rvqNjUiT/UaMYm8k+i4teCYOSg/ lbp9WDH3hamYhncb7TgQhCKbiWZXh7LFKItDjQMUyV/UwUxXTSC+ykctPkZXBumrUmMI K4g3fcZHPqbgtiVqXxextA2WLFxgGz3zhaDYiUzgbqKNcAZus7gnXqyJFC0m131RiG8G 6eL2ypB8E5zAh+1ahaEzu4jBmB5FXpWMaWpPENWnxmKtRwNmuvbLEOC/XDEMrxDApxan 0NAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=WNHOWN+0Coztu38fB5yaHQpPDHparb+VQPnzTlZJ0JE=; b=jzp2fpNaPzd8QoFXa+FJ3FS5vHfIhBHoieynYthV3EZaL+94BcCQPINXJOmAU6ZyPY URlCgM3oueCvfprSJCSsG97M2ZIwQKXXheyXTNCCSIRJEELYhkG3mCITKnNChSx4ogCw fR7YBQVPyHUX+DhCFjRC1YBVXeSh/RAc8Xki5pNMur5YJ8uvF8R460EYhlUncDxCdDok N4TKvEDdThrctlrvmoDHstNz2V5i0Djc7Iu1nztLmrRD5NgvzsQOU3YRNwxscvb/fjEW CQ7AIRM1nzOvfwzrIrmAbWROsLTEXMP5Tf5X1JhKG7udCYJlegf0MOX3FdU9B67oRzMN MYgQ== X-Gm-Message-State: APjAAAV04jT5Jr5fg1RHsEztoWdaChj38Rk3tn8kX+UIC9d0VkxEn8EE igDgoOREkedqDLVCdA/ZdYc7uw== X-Received: by 2002:a65:6458:: with SMTP id s24mr23405467pgv.158.1567401705371; Sun, 01 Sep 2019 22:21:45 -0700 (PDT) Received: from hev-sbc.hz.ali.com ([47.89.83.40]) by smtp.gmail.com with ESMTPSA id w207sm14636242pff.93.2019.09.01.22.21.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Sep 2019 22:21:44 -0700 (PDT) From: hev To: linux-fsdevel@vger.kernel.org Cc: e@80x24.org, Heiher , Al Viro , Andrew Morton , Davide Libenzi , Davidlohr Bueso , Dominik Brodowski , Jason Baron , Linus Torvalds , Roman Penyaev , Sridhar Samudrala , linux-kernel@vger.kernel.org Subject: [PATCH RESEND] fs/epoll: fix the edge-triggered mode for nested epoll Date: Mon, 2 Sep 2019 13:20:34 +0800 Message-Id: <20190902052034.16423-1-r@hev.cc> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Heiher The structure of event pools: efd[1]: { efd[2] (EPOLLIN) } efd[0]: { efd[2] (EPOLLIN | EPOLLET) } | | +-----------------+-----------------+ | v efd[2]: { sfd[0] (EPOLLIN) } When sfd[0] to be readable: * the epoll_wait(efd[0], ..., 0) should return efd[2]'s events on first call, and returns 0 on next calls, because efd[2] is added in edge-triggered mode. * the epoll_wait(efd[1], ..., 0) should returns efd[2]'s events on every calls until efd[2] is not readable (epoll_wait(efd[2], ...) => 0), because efd[1] is added in level-triggered mode. * the epoll_wait(efd[2], ..., 0) should returns sfd[0]'s events on every calls until sfd[0] is not readable (read(sfd[0], ...) => EAGAIN), because sfd[0] is added in level-triggered mode. Test code: #include #include #include #include int main(int argc, char *argv[]) { int sfd[2]; int efd[3]; int nfds; struct epoll_event e; if (socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0) goto out; efd[0] = epoll_create(1); if (efd[0] < 0) goto out; efd[1] = epoll_create(1); if (efd[1] < 0) goto out; efd[2] = epoll_create(1); if (efd[2] < 0) goto out; e.events = EPOLLIN; if (epoll_ctl(efd[2], EPOLL_CTL_ADD, sfd[0], &e) < 0) goto out; e.events = EPOLLIN; if (epoll_ctl(efd[1], EPOLL_CTL_ADD, efd[2], &e) < 0) goto out; e.events = EPOLLIN | EPOLLET; if (epoll_ctl(efd[0], EPOLL_CTL_ADD, efd[2], &e) < 0) goto out; if (write(sfd[1], "w", 1) != 1) goto out; nfds = epoll_wait(efd[0], &e, 1, 0); if (nfds != 1) goto out; nfds = epoll_wait(efd[0], &e, 1, 0); if (nfds != 0) goto out; nfds = epoll_wait(efd[1], &e, 1, 0); if (nfds != 1) goto out; nfds = epoll_wait(efd[1], &e, 1, 0); if (nfds != 1) goto out; nfds = epoll_wait(efd[2], &e, 1, 0); if (nfds != 1) goto out; nfds = epoll_wait(efd[2], &e, 1, 0); if (nfds != 1) goto out; close(efd[2]); close(efd[1]); close(efd[0]); close(sfd[0]); close(sfd[1]); printf("PASS\n"); return 0; out: printf("FAIL\n"); return -1; } Cc: Al Viro Cc: Andrew Morton Cc: Davide Libenzi Cc: Davidlohr Bueso Cc: Dominik Brodowski Cc: Eric Wong Cc: Jason Baron Cc: Linus Torvalds Cc: Roman Penyaev Cc: Sridhar Samudrala Cc: linux-kernel@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org Signed-off-by: hev --- fs/eventpoll.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/eventpoll.c b/fs/eventpoll.c index d7f1f5011fac..a44cb27c636c 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -672,6 +672,7 @@ static __poll_t ep_scan_ready_list(struct eventpoll *ep, { __poll_t res; int pwake = 0; + int nwake = 0; struct epitem *epi, *nepi; LIST_HEAD(txlist); @@ -685,6 +686,9 @@ static __poll_t ep_scan_ready_list(struct eventpoll *ep, if (!ep_locked) mutex_lock_nested(&ep->mtx, depth); + if (!depth || list_empty(&ep->rdllist)) + nwake = 1; + /* * Steal the ready list, and re-init the original one to the * empty list. Also, set ep->ovflist to NULL so that events @@ -739,7 +743,7 @@ static __poll_t ep_scan_ready_list(struct eventpoll *ep, list_splice(&txlist, &ep->rdllist); __pm_relax(ep->ws); - if (!list_empty(&ep->rdllist)) { + if (nwake && !list_empty(&ep->rdllist)) { /* * Wake up (if active) both the eventpoll wait list and * the ->poll() wait list (delayed after we release the lock). -- 2.23.0