From owner-freebsd-net@FreeBSD.ORG Thu Apr 10 01:09:54 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 9929EBA3 for ; Thu, 10 Apr 2014 01:09:54 +0000 (UTC) Received: from mail-qa0-x22b.google.com (mail-qa0-x22b.google.com [IPv6:2607:f8b0:400d:c00::22b]) (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 5AC461A86 for ; Thu, 10 Apr 2014 01:09:54 +0000 (UTC) Received: by mail-qa0-f43.google.com with SMTP id j15so3273644qaq.30 for ; Wed, 09 Apr 2014 18:09:53 -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=LLTdDil7vlMg8Xrxax9Qw2xk4MK+0Hb7rztVfqITtMc=; b=dIXXYanHW1Bw/2jwqoUJjEYqohqn+9DJdA67Necp1K4EyWFfQY5fYiXL30OR68ny1r s/YpngT8//nsjeH9URgFXfDC3mtc4TKAvLJAlR7y5tGGsM9toHeOf7ls7fZ7qw2XXeEM 50izx0CqtcCshE23QvXBsuYYZFhAAisidU47gIJ6kK5XE0mnoMTy+po1aD89Lm3om3hU 6GjJIXMDp+hrthaGda2ZdEkMJ5Qgv88B1I3Y7a51mpLoLPXHiE4BmzHXB0LNsVJalvfy Vnuq7tIfjPn6j+qlI1zycCACKtHHPmlGZ2QsvYln5Mo10/hB414+pVVHAtiUo0vJ7sLg Xyrw== MIME-Version: 1.0 X-Received: by 10.140.42.38 with SMTP id b35mr15775940qga.87.1397092193592; Wed, 09 Apr 2014 18:09:53 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.224.50.206 with HTTP; Wed, 9 Apr 2014 18:09:53 -0700 (PDT) In-Reply-To: <5345BAE7.4010501@gmail.com> References: <53459C96.5040304@gmail.com> <5345BAE7.4010501@gmail.com> Date: Wed, 9 Apr 2014 18:09:53 -0700 X-Google-Sender-Auth: d1zjfM23LM1kXrjhHVmb08MfYJ0 Message-ID: Subject: Re: Preventing ng_callout() timeouts to trigger packet queuing From: Adrian Chadd To: Karim Fodil-Lemelin 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: Thu, 10 Apr 2014 01:09:54 -0000 Hi! Would you mind filing a PR for this? www.freebsd.org/send-pr.html That way it won't (hopefully!) get lost. Thanks! -a On 9 April 2014 14:25, 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"