From owner-freebsd-net@FreeBSD.ORG Wed Apr 9 21:26:05 2014 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id CA010FE9 for ; Wed, 9 Apr 2014 21:26:05 +0000 (UTC) Received: from mail-ie0-x22d.google.com (mail-ie0-x22d.google.com [IPv6:2607:f8b0:4001:c03::22d]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 97E4512B8 for ; Wed, 9 Apr 2014 21:26:05 +0000 (UTC) Received: by mail-ie0-f173.google.com with SMTP id rl12so3092599iec.32 for ; Wed, 09 Apr 2014 14:26:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=2qHdAKTg+HrLeLP33KMMWVN5D/XFVnU6NVEuQAo1x/c=; b=Q+Gj69JD5i3yMoTfdBmkZrPaV+mQzedh7n8DB+0zHOh26dg71LmqnAuln3ocnFBvM0 Nu7/pGd9GizBqsSgQpXSVmI918GuqyVG3WrDUmmCm2nlveDaRe0llfRUgJ/y/VnMb3Eo ZX10mW+pBarH2red0sLNCFUrYD2vTZbiEclOZ/iXcxIc3zEeNsTgMrzBkdmSDisIUB8d dGYgcMYJ3vToyWxuVZfLRRjr9sxBfF504yLBJwGAiDSkbBtXX6kTCrGUEMHjvBn6V2ha IqTRDuQ6Ae8Kv/iSWoqCI935Bst3V6cnQOr52VOoedk4PsNq3TU630Wi+5sCZXx6xeQX h3uQ== X-Received: by 10.42.13.210 with SMTP id e18mr10033352ica.10.1397078764974; Wed, 09 Apr 2014 14:26:04 -0700 (PDT) Received: from [10.10.1.35] ([192.252.130.194]) by mx.google.com with ESMTPSA id i16sm14196927igf.11.2014.04.09.14.26.04 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 09 Apr 2014 14:26:04 -0700 (PDT) Message-ID: <5345BAE7.4010501@gmail.com> Date: Wed, 09 Apr 2014 17:25:59 -0400 From: Karim Fodil-Lemelin User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: freebsd-net@freebsd.org Subject: Re: Preventing ng_callout() timeouts to trigger packet queuing References: <53459C96.5040304@gmail.com> In-Reply-To: <53459C96.5040304@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 Apr 2014 21:26:05 -0000 Hi, Below is a revised patch for this issue. It accounts for nodes or hooks that explicitly need to be queuing: @@ -3632,7 +3632,12 @@ ng_callout(struct callout *c, node_p node, hook_p hook, int ticks, if ((item = ng_alloc_item(NGQF_FN, NG_NOFLAGS)) == NULL) return (ENOMEM); - item->el_flags |= NGQF_WRITER; + if ((node->nd_flags & NGF_FORCE_WRITER) || + (hook && (hook->hk_flags & HK_FORCE_WRITER))) + item->el_flags |= NGQF_WRITER; + else + item->el_flags |= NGQF_READER; + NG_NODE_REF(node); /* and one for the item */ NGI_SET_NODE(item, node); if (hook) { Regards, Karim. On 09/04/2014 3:16 PM, Karim Fodil-Lemelin wrote: > Hi List, > > I'm calling out to the general wisdom ... I have seen an issue in > netgraph where, if called, a callout routine registered by > ng_callout() will trigger packet queuing inside the worklist of > netgraph since ng_callout() makes my node suddenly a WRITER node > (therefore non reentrant) for the duration of the call. > > So as soon as the callout function returns, all following packets will > get directly passed to the node again and when the ngintr thread gets > executed then only then will I get the queued packets. This introduces > out of order packets in the flow. I am using the current patch below > to solve the issue and I am wondering if there is anything wrong with > it (and maybe contribute back :): > > > @@ -3632,7 +3632,7 @@ ng_callout(struct callout *c, node_p node, > hook_p hook, int ticks, > if ((item = ng_alloc_item(NGQF_FN, NG_NOFLAGS)) == NULL) > return (ENOMEM); > > - item->el_flags |= NGQF_WRITER; > + item->el_flags = NGQF_READER; > NG_NODE_REF(node); /* and one for the item */ > NGI_SET_NODE(item, node); > if (hook) { > > > Best regards, > > Karim. > _______________________________________________ > freebsd-net@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"