process_backlog() -- 处理从网卡上读取的sk_buff队列

190 篇文章 1 订阅
net_rx_action()  --> process_backlog()

 

前面已经说过,软中断处理函数net_rx_action调用设备的poll方法(默认为process_backlog),而process_backlog函数将进一步调用netif_receive_skb()将数据包传上协议栈,如果设备自身注册了poll函数,也将调用netif_receive_skb()函数

 

/usr/src/linux-2.6.19/net/core/dev.c

static int process_backlog(struct net_device *backlog_dev, int *budget)
{
    int work = 0;
    int quota = min(backlog_dev->quota, *budget);
    struct  softnet_data  *queue = &__get_cpu_var(softnet_data);
    unsigned long start_time = jiffies;
    backlog_dev->weight = weight_p;

     for (;;) {
        struct sk_buff *skb;
        struct net_device *dev;
        local_irq_disable();
        skb =  __skb_dequeue (&queue->input_pkt_queue);
        if (!skb)
            goto job_done;
        local_irq_enable();
        dev = skb->dev;
         netif_receive_skb (skb);
        dev_put(dev);
        work++;
        if (work >= quota || jiffies - start_time > 1)
            break;
     }

    backlog_dev->quota -= work;
    *budget -= work;
    return -1;
job_done:
    backlog_dev->quota -= work;
    *budget -= work;
    list_del(&backlog_dev->poll_list);
    smp_mb__before_clear_bit();
    netif_poll_enable(backlog_dev);
    local_irq_enable();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值