From owner-freebsd-net@FreeBSD.ORG Fri Apr 11 19:51:10 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 397A0C82; Fri, 11 Apr 2014 19:51:10 +0000 (UTC) Received: from mail-qc0-x230.google.com (mail-qc0-x230.google.com [IPv6:2607:f8b0:400d:c01::230]) (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 DEA9815F4; Fri, 11 Apr 2014 19:51:09 +0000 (UTC) Received: by mail-qc0-f176.google.com with SMTP id m20so6445575qcx.35 for ; Fri, 11 Apr 2014 12:51:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; bh=Y4X9hykRQGajzVTU1qAE3wxhe5y8kEd5uChh7a/1cvY=; b=pSMMc5RcqttygHj+jPxmKsDEO15v+5OArTc0bMocCHZPRJEIOaIw3BsGDtphXFkxEr c1ERM2clrzIrQJHkf1mj2kwrh/IKkN/YMTpBuQKCx4fFaDacF43JLhLjh9GWnB1rxihC 1jMY1A3proe9v/DjXVfo2XAUUXxo0Vr4qF82rfU7PSpVwtdrIvIeoNaaU+R1niTiqGMi ttDfYj+Ne+7IyG/p1ZzwZ2UVU8UbIfxFPZph8yRWtheSZqeM8qlc4jHlD+1t/7A1q+fI lDssvao2UUQOA0vPfpeVm2XR9JzwSJqHZE95ELpLBQO8+12sMIcOy9mO5nXvhKzh7BPo mosg== MIME-Version: 1.0 X-Received: by 10.229.53.136 with SMTP id m8mr32381680qcg.4.1397245868679; Fri, 11 Apr 2014 12:51:08 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.224.50.206 with HTTP; Fri, 11 Apr 2014 12:51:08 -0700 (PDT) In-Reply-To: <53483B8B.7030409@freebsd.org> References: <53459C96.5040304@gmail.com> <5345BAE7.4010501@gmail.com> <53483B8B.7030409@freebsd.org> Date: Fri, 11 Apr 2014 12:51:08 -0700 X-Google-Sender-Auth: YP-mfjcIlbZEbQhEadWSwER5ZgM Message-ID: Subject: Re: Preventing ng_callout() timeouts to trigger packet queuing From: Adrian Chadd To: Julian Elischer Content-Type: text/plain; charset=ISO-8859-1 Cc: FreeBSD Net 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: Fri, 11 Apr 2014 19:51:10 -0000 Well, ethernet drivers nowdays seem to be doing: * always queue * then pop the head item off the queue and transmit that. -a On 11 April 2014 11:59, Julian Elischer wrote: > disclaimer: I'm not looking at the code now.. I want to go to bed: :-) > > When I wrote that code, the idea was that even a direct node execution > should become a queuing operation if there was already something else on the > queue. so in that model packets were not supposed to get re-ordered. does > that not still work? > > Either that, or you need to explain the problem to me a bit better.. > > > > On 4/10/14, 5:25 AM, Karim Fodil-Lemelin wrote: >> >> 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" >> >> >> _______________________________________________ >> 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" >> > > _______________________________________________ > 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"