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

来源:互联网 发布:中小型软件构架实践 编辑:程序博客网 时间:2024/05/17 04:41
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;
}
原创粉丝点击