From patchwork Fri Oct 20 23:40:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 828867 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="qLnBExXO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yJj3p09fyz9t3H for ; Sat, 21 Oct 2017 10:41:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752720AbdJTXlF (ORCPT ); Fri, 20 Oct 2017 19:41:05 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:46402 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752498AbdJTXlE (ORCPT ); Fri, 20 Oct 2017 19:41:04 -0400 Received: by mail-pf0-f195.google.com with SMTP id p87so13122479pfj.3 for ; Fri, 20 Oct 2017 16:41:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=GbE3pUB2tqVWSPfjljjxfurTG0qbaNdD1ZR1dbtm8RE=; b=qLnBExXOAfZwvwegZq/a53+hTX50KUNva5gjTKHyP2sx2VA+ObRKrwVkZBb0zTHLhu iuUmTLFIvGoTLULdLlc5xCGSlKryIAocagiHzT5v4cU4Y46q2iZBZOqBHsIeCGh/Tj8O ZpVtfPNmCqFeNnLIJoHvSWmRdsxC1D3m5sM9LtWw8AJRo4eBPIIfhHw7cAi4i97E9foy uOhVJq1BuCaOcJvpm+1VSZg8QTi0Gi6CNy3qIZ0Z3JB2pF2QF689lqKvuxxhG1q7LYVz nQ5r1yGPQ0DHV+yiiVRDH29mKmHwogmWKe4fmjgGBc3xrS3vYIvWPqHn0+KGfq5Ix5vX t4Vw== 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; bh=GbE3pUB2tqVWSPfjljjxfurTG0qbaNdD1ZR1dbtm8RE=; b=DqkdMHQlX0UmNsTG2xBLc1PL9HjkqW1ZqiPfPSW7rECKh8JnTBC1k5Yuf5vYaGfo1N KOz8K7l9b/f2G1MrwzPzopYb/gPnzYeCTsKzLUtQjKTPqDoUs69KEAa+5MuXUS41AHFe CIsDJTtn5piEjAgdaLzfSFBBFJIo9o0/2+UEqQ5fJ6OP6/joXdF34L/gFB93B4GZX62P 3YGWXVy+xzaBvW6fFAlMjuRaM6AMx76dG7UCoXXwKSabTvEtupa7m6JK1yepiweYHg7D 6n82axTEJQS1UxOVJQ3k4gL+wGsDzmQLGBD1sybwsv7ykVZdiYsWA2i3ML9rD0oKd82O pl7g== X-Gm-Message-State: AMCzsaWChWcVfY4Ls0Yh1XUi+oDCv4OrbJerEKEHLA1t1ph3NDt6cC3F 3Rb8F7cv68P2hWRyLThFCF8t1g== X-Google-Smtp-Source: ABhQp+QXJ3ToU+fkMT8Y5+p4WeYj6asXjCqC3WlhwzazE24yGGjRv8qlZvKf6PmaZlRK26AuoN0X2A== X-Received: by 10.159.203.197 with SMTP id r5mr5319101plo.431.1508542864070; Fri, 20 Oct 2017 16:41:04 -0700 (PDT) Received: from localhost.localdomain (67-207-98-98.static.wiline.com. [67.207.98.98]) by smtp.gmail.com with ESMTPSA id 68sm3207011pfx.105.2017.10.20.16.41.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Oct 2017 16:41:02 -0700 (PDT) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, eric.dumazet@gmail.com, john.fastabend@gmail.com, Tom Herbert Subject: [PATCH net-next] strparser: Use delayed work instead of timer for msg timeout Date: Fri, 20 Oct 2017 16:40:43 -0700 Message-Id: <20171020234043.2629-1-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Sock lock may be taken in the message timer function which is a problem since timers run in BH. Instead of timers use delayed_work. Reported-by: Eric Dumazet Fixes: bbb03029a899 ("strparser: Generalize strparser") Signed-off-by: Tom Herbert --- include/net/strparser.h | 3 +-- net/strparser/strparser.c | 17 ++++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/include/net/strparser.h b/include/net/strparser.h index 7dc131d62ad5..d96b59f45eba 100644 --- a/include/net/strparser.h +++ b/include/net/strparser.h @@ -74,10 +74,9 @@ struct strparser { u32 unrecov_intr : 1; struct sk_buff **skb_nextp; - struct timer_list msg_timer; struct sk_buff *skb_head; unsigned int need_bytes; - struct delayed_work delayed_work; + struct delayed_work msg_timer_work; struct work_struct work; struct strp_stats stats; struct strp_callbacks cb; diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c index d4ea46a5f233..c5fda15ba319 100644 --- a/net/strparser/strparser.c +++ b/net/strparser/strparser.c @@ -49,7 +49,7 @@ static void strp_abort_strp(struct strparser *strp, int err) { /* Unrecoverable error in receive */ - del_timer(&strp->msg_timer); + cancel_delayed_work(&strp->msg_timer_work); if (strp->stopped) return; @@ -68,7 +68,7 @@ static void strp_abort_strp(struct strparser *strp, int err) static void strp_start_timer(struct strparser *strp, long timeo) { if (timeo) - mod_timer(&strp->msg_timer, timeo); + mod_delayed_work(strp_wq, &strp->msg_timer_work, timeo); } /* Lower lock held */ @@ -319,7 +319,7 @@ static int __strp_recv(read_descriptor_t *desc, struct sk_buff *orig_skb, eaten += (cand_len - extra); /* Hurray, we have a new message! */ - del_timer(&strp->msg_timer); + cancel_delayed_work(&strp->msg_timer_work); strp->skb_head = NULL; STRP_STATS_INCR(strp->stats.msgs); @@ -450,9 +450,10 @@ static void strp_work(struct work_struct *w) do_strp_work(container_of(w, struct strparser, work)); } -static void strp_msg_timeout(unsigned long arg) +static void strp_msg_timeout(struct work_struct *w) { - struct strparser *strp = (struct strparser *)arg; + struct strparser *strp = container_of(w, struct strparser, + msg_timer_work.work); /* Message assembly timed out */ STRP_STATS_INCR(strp->stats.msg_timeouts); @@ -505,9 +506,7 @@ int strp_init(struct strparser *strp, struct sock *sk, strp->cb.read_sock_done = cb->read_sock_done ? : default_read_sock_done; strp->cb.abort_parser = cb->abort_parser ? : strp_abort_strp; - setup_timer(&strp->msg_timer, strp_msg_timeout, - (unsigned long)strp); - + INIT_DELAYED_WORK(&strp->msg_timer_work, strp_msg_timeout); INIT_WORK(&strp->work, strp_work); return 0; @@ -532,7 +531,7 @@ void strp_done(struct strparser *strp) { WARN_ON(!strp->stopped); - del_timer_sync(&strp->msg_timer); + cancel_delayed_work_sync(&strp->msg_timer_work); cancel_work_sync(&strp->work); if (strp->skb_head) {