From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gavin Shan Subject: [PATCH v2 net-next 2/8] net/ncsi: Properly track channel monitor timer state Date: Thu, 13 Apr 2017 17:48:15 +1000 Message-ID: <1492069701-20772-3-git-send-email-gwshan@linux.vnet.ibm.com> References: <1492069701-20772-1-git-send-email-gwshan@linux.vnet.ibm.com> Cc: joe@perches.com, davem@davemloft.net, Gavin Shan To: netdev@vger.kernel.org Return-path: Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:48524 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756320AbdDMHtu (ORCPT ); Thu, 13 Apr 2017 03:49:50 -0400 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v3D7nXc2052280 for ; Thu, 13 Apr 2017 03:49:39 -0400 Received: from e23smtp07.au.ibm.com (e23smtp07.au.ibm.com [202.81.31.140]) by mx0a-001b2d01.pphosted.com with ESMTP id 29sw2ageq4-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Thu, 13 Apr 2017 03:49:39 -0400 Received: from localhost by e23smtp07.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 13 Apr 2017 17:49:27 +1000 Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay10.au.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v3D7nG7d54591654 for ; Thu, 13 Apr 2017 17:49:24 +1000 Received: from d23av04.au.ibm.com (localhost [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id v3D7mpng006436 for ; Thu, 13 Apr 2017 17:48:51 +1000 In-Reply-To: <1492069701-20772-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