From patchwork Wed Apr 5 03:20:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Galbraith X-Patchwork-Id: 747082 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 3vyWMR5CXxz9s8D for ; Wed, 5 Apr 2017 13:21:07 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752510AbdDEDVE (ORCPT ); Tue, 4 Apr 2017 23:21:04 -0400 Received: from mout.gmx.net ([212.227.17.21]:51505 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751692AbdDEDU7 (ORCPT ); Tue, 4 Apr 2017 23:20:59 -0400 Received: from homer.simpson.net ([212.114.173.232]) by mail.gmx.com (mrgmx103 [212.227.17.168]) with ESMTPSA (Nemesis) id 0MAQMg-1cpWg32iEc-00BdeS; Wed, 05 Apr 2017 05:20:29 +0200 Message-ID: <1491362429.4536.77.camel@gmx.de> Subject: Re: net/sched: latent livelock in dev_deactivate_many() due to yield() usage From: Mike Galbraith To: Cong Wang Cc: netdev , LKML , Peter Zijlstra Date: Wed, 05 Apr 2017 05:20:29 +0200 In-Reply-To: References: <1491107321.13631.33.camel@gmx.de> X-Mailer: Evolution 3.16.5 Mime-Version: 1.0 X-Provags-ID: V03:K0:qjtdAaeSa04cTXbnRx6X7RkV+mA9rsfw4U/krMN5cKXmKjkmLvu FkQrepMJqMoupGCcD9oSxJUe/iy+hAEhL7jHyNZ7rDG5hvNps4vSc7d7w0dtYiw4Ea9SSF8 jM3/JNDn1+9zRs3csGQzcYkMjWdBJTqTiT2YBJ11KlJ+N3H6jPXuIyjZKByKbHIkHGkqkeX Mv1DOA8Eo1nYs0aN7EYYg== X-UI-Out-Filterresults: notjunk:1; V01:K0:KRnZ5u9UQpw=:YA9y9CLENYHuc0gzAybPAu qUnaohwWHUatjAau3jXeV1YmDuUFC7IDh7MNROF8dMlFfNy8wwTtDckjWC+j2/TGpYENQ8+qy 7kleRDt6V/Y7kudX+V1cPGa9xeUR4ky6zE+u1Sutdra3c+neZkXoaKHe6L85Bq1etCOkZ/Ehw am9Gu+invp8MmNILb1WjscFJsLMuOhn2sWh8l2lcO146Ja1/9EwaBV3Uis3MqU6BzJmwFMjLT P5hc3SMTOpt2glTc1ELq+wk0pDnsMlm/mEqzfRe9qGG/SusMWhK8Jlq8Dy3k2h6iABvADLfnv 5eSAT9n3ZPM0a0cRAXxpCBvY52doPlIGauIMYf09SKJ0AaFfTojN/Nj0HRd761QfNpO8sPUTC 3fh6aYAhBCcsEatH99Bv6JaxlOnVfxxDkRTUoYuiFrvRikab+96bkFRC0U12OlYcB4MrhMdsP bdbHUXxqH3CFdG8HuTUhqKbSDi2iH1M3lz42ibpOr6MNIXBHuMUOY0nuQMS+8UJQ72O0kWE/F BWQzcr+th8cbtUhpuHH+Vs6hYoAK3WktVWSxDNErHPTTgc2BevRq/ZE6Zr33iBq4YEB8apSbH 9cgQxLgjixDytKdb1qN5k3Ixaj9W+OaUBVZxMOmj0B8kakZoWHxpHSczRkjfiXdJZHiNid0Q1 cwNnOfzitGXQC1VGYksWGJ1r7Tv5M9UHiXXdftR1BAy25vDXTFOuCeiMnQsqtIrK54fB57Alc Zt4xZRYbAsKZfdGXGsqFTpG0phsOsZmcDco6O6Wt8A5m203xIQffZofWWzZcbO05Mne+qsDXd 5H5ZomG Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org On Tue, 2017-04-04 at 15:39 -0700, Cong Wang wrote: > Thanks for the report! Looks like a quick solution here is to replace > this yield() with cond_resched(), it is harder to really wait for > all qdisc's to transmit all packets. No, cond_resched() won't help. What I did is below, but I suspect net wizards will do something better. --- net/sched/sch_generic.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -901,6 +902,7 @@ static bool some_qdisc_is_busy(struct ne */ void dev_deactivate_many(struct list_head *head) { + DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(swait); struct net_device *dev; bool sync_needed = false; @@ -924,8 +926,7 @@ void dev_deactivate_many(struct list_hea /* Wait for outstanding qdisc_run calls. */ list_for_each_entry(dev, head, close_list) - while (some_qdisc_is_busy(dev)) - yield(); + swait_event_timeout(swait, !some_qdisc_is_busy(dev), 1); } void dev_deactivate(struct net_device *dev)