[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <AANLkTi=Wup0D0ZxTMa=VKkaawP4yAEP=rtw+CRwsJh3-@mail.gmail.com>
Date: Sat, 4 Dec 2010 21:29:23 +0800
From: Changli Gao <xiaosuo@...il.com>
To: Jarek Poplawski <jarkao2@...il.com>
Cc: jamal <hadi@...erus.ca>, netdev@...r.kernel.org
Subject: Re: [PATCH 3/3] ifb: move tq from ifb_private
On Sat, Dec 4, 2010 at 9:15 PM, Jarek Poplawski <jarkao2@...il.com> wrote:
> Changli Gao wrote:
>> tq is only used in ri_tasklet, so we move it from ifb_private to a
>> stack variable of ri_tasklet.
>>
>> skb_queue_splice_tail_init() is used instead of the open coded and slow
>> one.
>>
>> Signed-off-by: Changli Gao <xiaosuo@...il.com>
>> ---
>> drivers/net/ifb.c | 49 ++++++++++++-------------------------------------
>> 1 file changed, 12 insertions(+), 37 deletions(-)
>> diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c
>> index d1e362a..cd6e90d 100644
>> --- a/drivers/net/ifb.c
>> +++ b/drivers/net/ifb.c
>> @@ -39,9 +39,7 @@
>> #define TX_Q_LIMIT 32
>> struct ifb_private {
>> struct tasklet_struct ifb_tasklet;
>> - int tasklet_pending;
>> struct sk_buff_head rq;
>> - struct sk_buff_head tq;
>> };
>>
>> static int numifbs = 2;
>> @@ -53,27 +51,25 @@ static int ifb_close(struct net_device *dev);
>>
>> static void ri_tasklet(unsigned long dev)
>> {
>> -
>> struct net_device *_dev = (struct net_device *)dev;
>> struct ifb_private *dp = netdev_priv(_dev);
>> struct net_device_stats *stats = &_dev->stats;
>> struct netdev_queue *txq;
>> struct sk_buff *skb;
>> + struct sk_buff_head tq;
>>
>> + __skb_queue_head_init(&tq);
>> txq = netdev_get_tx_queue(_dev, 0);
>> - if ((skb = skb_peek(&dp->tq)) == NULL) {
>> - if (__netif_tx_trylock(txq)) {
>> - while ((skb = skb_dequeue(&dp->rq)) != NULL) {
>> - skb_queue_tail(&dp->tq, skb);
>> - }
>> - __netif_tx_unlock(txq);
>> - } else {
>> - /* reschedule */
>> - goto resched;
>> - }
>> + if (!__netif_tx_trylock(txq)) {
>> + tasklet_schedule(&dp->ifb_tasklet);
>> + return;
>> }
>> + skb_queue_splice_tail_init(&dp->rq, &tq);
>> + if (netif_tx_queue_stopped(txq))
>> + netif_tx_wake_queue(txq);
>> + __netif_tx_unlock(txq);
>>
>> - while ((skb = skb_dequeue(&dp->tq)) != NULL) {
>> + while ((skb = __skb_dequeue(&tq)) != NULL) {
>> u32 from = G_TC_FROM(skb->tc_verd);
>>
>> skb->tc_verd = 0;
>> @@ -87,7 +83,7 @@ static void ri_tasklet(unsigned long dev)
>> rcu_read_unlock();
>> dev_kfree_skb(skb);
>> stats->tx_dropped++;
>> - break;
>> + continue;
>
> IMHO this line is a bugfix and should be a separate patch (for stable).
It sounds reasonable.
>
> The rest looks OK to me but you could probably skip locking of dp->rq
> similarly to tq.
>
OK. Thanks.
--
Regards,
Changli Gao(xiaosuo@...il.com)
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists