From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gavin Shan Subject: [PATCH v4 net-next 02/10] net/ncsi: Properly track channel monitor timer state Date: Wed, 3 May 2017 14:44:33 +1000 Message-ID: <1493786681-27468-3-git-send-email-gwshan@linux.vnet.ibm.com> References: <1493786681-27468-1-git-send-email-gwshan@linux.vnet.ibm.com> Cc: joe@perches.com, kubakici@wp.pl, f.fainelli@gmail.com, davem@davemloft.net, Gavin Shan To: netdev@vger.kernel.org Return-path: Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:35842 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751247AbdECEpt (ORCPT ); Wed, 3 May 2017 00:45:49 -0400 Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v434htJk063373 for ; Wed, 3 May 2017 00:45:48 -0400 Received: from e23smtp03.au.ibm.com (e23smtp03.au.ibm.com [202.81.31.145]) by mx0a-001b2d01.pphosted.com with ESMTP id 2a73gvt591-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Wed, 03 May 2017 00:45:47 -0400 Received: from localhost by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 3 May 2017 14:45:45 +1000 Received: from d23av05.au.ibm.com (d23av05.au.ibm.com [9.190.234.119]) by d23relay07.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v434jYF142991748 for ; Wed, 3 May 2017 14:45:42 +1000 Received: from d23av05.au.ibm.com (localhost [127.0.0.1]) by d23av05.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id v434j9wx018185 for ; Wed, 3 May 2017 14:45:10 +1000 In-Reply-To: <1493786681-27468-1-git-send-email-gwshan@linux.vnet.ibm.com> Sender: netdev-owner@vger.kernel.org List-ID: The field @monitor.enabled in the NCSI channel descriptor is used to track the state of channel monitor timer. It indicates the timer's state (pending or not). We could not start the timer again in its handler. In that case, We missed to update @monitor.enabled to false. It leads to below warning printed by WARN_ON_ONCE() when the monitor is restarted afterwards. ------------[ cut here ]------------ WARNING: CPU: 0 PID: 411 at /var/lib/jenkins/workspace/openbmc-build \ /distro/ubuntu/target/palmetto/openbmc/build/tmp/work-shared/palmetto \ net/ncsi/ncsi-manage.c:240 ncsi_start_channel_monitor+0x44/0x7c CPU: 0 PID: 411 Comm: kworker/0:3 Not tainted \ 4.7.10-f26558191540830589fe03932d05577957670b8d #1 Hardware name: ASpeed SoC Workqueue: events ncsi_dev_work [] (unwind_backtrace) from [] (show_stack+0x10/0x14) [] (show_stack) from [] (__warn+0xc4/0xf0) [] (__warn) from [] (warn_slowpath_null+0x1c/0x24) [] (warn_slowpath_null) from [] (ncsi_start_channel_monitor+0x44/0x7c) [] (ncsi_start_channel_monitor) from [] (ncsi_configure_channel+0x27c/0x2dc) [] (ncsi_configure_channel) from [] (ncsi_dev_work+0x39c/0x3e8) [] (ncsi_dev_work) from [] (process_one_work+0x1b8/0x2fc) [] (process_one_work) from [] (worker_thread+0x2c0/0x3f8) [] (worker_thread) from [] (kthread+0xd0/0xe8) [] (kthread) from [] (ret_from_fork+0x14/0x24) ---[ end trace 110cccf2b038c44d ]--- This fixes the issue by updating @monitor.enabled to false if needed. Reported-by: Sridevi Ramesh Signed-off-by: Gavin Shan --- net/ncsi/ncsi-manage.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c index 5073e15..c71a3a5 100644 --- a/net/ncsi/ncsi-manage.c +++ b/net/ncsi/ncsi-manage.c @@ -183,11 +183,16 @@ static void ncsi_channel_monitor(unsigned long data) monitor_state = nc->monitor.state; spin_unlock_irqrestore(&nc->lock, flags); - if (!enabled || chained) + if (!enabled || chained) { + ncsi_stop_channel_monitor(nc); return; + } + if (state != NCSI_CHANNEL_INACTIVE && - state != NCSI_CHANNEL_ACTIVE) + state != NCSI_CHANNEL_ACTIVE) { + ncsi_stop_channel_monitor(nc); return; + } switch (monitor_state) { case NCSI_CHANNEL_MONITOR_START: @@ -199,6 +204,7 @@ static void ncsi_channel_monitor(unsigned long data) nca.req_flags = 0; ret = ncsi_xmit_cmd(&nca); if (ret) { + ncsi_stop_channel_monitor(nc); netdev_err(ndp->ndev.dev, "Error %d sending GLS\n", ret); return; @@ -218,6 +224,8 @@ static void ncsi_channel_monitor(unsigned long data) nc->state = NCSI_CHANNEL_INVISIBLE; spin_unlock_irqrestore(&nc->lock, flags); + ncsi_stop_channel_monitor(nc); + spin_lock_irqsave(&ndp->lock, flags); nc->state = NCSI_CHANNEL_INACTIVE; list_add_tail_rcu(&nc->link, &ndp->channel_queue); @@ -257,6 +265,10 @@ void ncsi_stop_channel_monitor(struct ncsi_channel *nc) nc->monitor.enabled = false; spin_unlock_irqrestore(&nc->lock, flags); + /* The timer isn't in pending state if we're deleting the timer + * in its handler. del_timer_sync() can detect it and just does + * nothing. + */ del_timer_sync(&nc->monitor.timer); } -- 2.7.4