From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24514 invoked by alias); 24 May 2007 09:43:34 -0000 Received: (qmail 24502 invoked by uid 22791); 24 May 2007 09:43:33 -0000 X-Spam-Check-By: sourceware.org Received: from anchor-post-32.mail.demon.net (HELO anchor-post-32.mail.demon.net) (194.217.242.90) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 24 May 2007 09:43:31 +0000 Received: from calivar.demon.co.uk ([83.104.54.243] helo=xl5.calivar.com) by anchor-post-32.mail.demon.net with esmtp (Exim 4.42) id 1Hr9qv-000Ghb-8l; Thu, 24 May 2007 09:43:25 +0000 Received: from xl5.calivar.com (localhost [127.0.0.1]) by xl5.calivar.com (Postfix) with ESMTP id BE405138743; Thu, 24 May 2007 10:43:24 +0100 (BST) To: Xiaochen Zhou Cc: ecos-discuss@sources.redhat.com References: <009501c79dde$685e4ea0$ae7aa50a@h3c.huawei3com.com> From: Nick Garnett Original-Sender: nickg@ecoscentric.com Date: Thu, 24 May 2007 12:30:00 -0000 In-Reply-To: <009501c79dde$685e4ea0$ae7aa50a@h3c.huawei3com.com> Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Mailing-List: contact ecos-discuss-help@ecos.sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: ecos-discuss-owner@ecos.sourceware.org Subject: Re: [ECOS] eth_drv_send() called recursively X-SW-Source: 2007-05/txt/msg00122.txt.bz2 Xiaochen Zhou writes: > Hi,everyone: > > Here is ethernet packet sending flow in our ecos application: > > 1. eth_drv_send() call my_eth_driver_send() > 2. my_eth_driver_send() call eth_drv_tx_done() > 3. eth_drv_tx_done() call eth_drv_send() > > eth_drv_send() and eth_drv_tx_done() are implemented in > io/eth/current/src/net/eth_drv.c > > eth_drv_tx_done(struct eth_drv_sc *sc, CYG_ADDRESS key, int status) > { > .... > eth_drv_send(ifp); > .... > > eth_drv_send(struct ifnet *ifp) > { > .... > while ((sc->funs->can_send)(sc) > 0) { > IF_DEQUEUE(&ifp->if_snd, m0); > if (m0 == 0) { > break; > } > .... > } > > If sending queue has many mbufs (we using queue for QOS application), > sending thread will call eth_drv_send() recursively, the stack of packet > sending thread will overflow. > > Can anyone tell me why call eth_drv_send() in eth_drv_tx_done()? In > eth_drv_send(), there are a loop to call IF_DEQUEUE(), so I think it is > useless and harmful. Can I delete "eth_drv_send(ifp)" line in > eth_drv_tx_done()? No! In general eth_drv_tx_done() is not called from the driver's send routine, it is usually called from the deliver/poll routine once the packet has actually been transmitted. Usually in response to an interrupt. The only situation in which eth_drv_tx_done() may be called from the send routine is if you have copied the packet out to an internal buffer, in the driver or hardware. In this case the can_send routine will fend off susequent send attempts until the packet is sent and a buffer is available. So I suspect that either your driver is calling eth_drv_tx_done() in the wrong place, or your can_send routine is not working correctly. Whatever the problem, deleting lines from generic code that has been working corretly for many years is not the correct solution. -- Nick Garnett eCos Kernel Architect eCosCentric Limited http://www.eCosCentric.com/ The eCos experts Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571 Registered in England and Wales: Reg No 4422071. -- Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss