免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3503 | 回复: 6
打印 上一主题 下一主题

在NAPI驱动pool时能中断不 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-24 14:15 |只看该作者 |倒序浏览
NAPI通过软中断调用pool函数时,在pool循环开始时中断被打开(按道理软中断也应该是可以被硬中断打断的,否则要软中断干啥,哈哈),可试想下:假设我测试网络流量,不断向设备发包,还没进入pool循环(实质性的do工作)或是pool过程中肯定回有向该设备发送的包(测试时包源源不段啊),那么中断是响应的,又会调用软中断再进入pool, 可是这样一来, 要pool有什么用啊,中断还是会不断触发啊(当pool时),   不知道我那儿说错了,还是代码没看仔细,
需要回答的问题:NAPI驱动pool时是否能中断?(我认为是可以),是否能被本设备中断?若能,当网络不断接受或发送包时会出现什么情况?谢谢
http://www.ibm.com/developerworks/cn/linux/l-napi/
http://www.chinaunix.net/jh/4/684828.html

论坛徽章:
0
2 [报告]
发表于 2007-04-24 18:31 |只看该作者

大家说下阿,上面的问题

为什么pool开始做时开中断时用local_irq_enable()呢,既然是pool,开放触发中断的设备中断线就没必要了吧,可以把其他的中断都打开,如果要开,也应该local_irq_enable后把此设备读或写的中断关掉呢,pool完成后再打开,pool的时间由最大时间片和最大配额控制就可以了避免过长,

论坛徽章:
0
3 [报告]
发表于 2007-04-24 22:31 |只看该作者
你还是看看NAPI的设计目的吧,具体文件google会告诉你

是poll,不是pool!!

论坛徽章:
0
4 [报告]
发表于 2007-04-26 17:33 |只看该作者
你看的哪个芯片的驱动,有些驱动是在进入poll之前关闭硬中断,出来又打开。

有些高级的芯片如intel 82571,可以在硬件层设置中断次数,驱动就不用关中断了。

软中断是在do_IRQ的后半部,硬中断执行完被调用的。

论坛徽章:
0
5 [报告]
发表于 2007-04-26 19:01 |只看该作者
我看的是8139cp.c
static int cp_rx_poll(struct pci_dev *pdev ,const struct pci_device_id *ent)

{
--------------

#ifndef FAST_POLL
rx_status_loop:
        rx = 0;
        cpw16(IntrStatus, cp_rx_intr_mask);
#endif

        while (1) {
                u32 status, len;
                dma_addr_t mapping;
                struct sk_buff *skb, *new_skb;
                struct cp_desc *desc;
                unsigned buflen;

                skb = cp->rx_skb[rx_tail].skb;
                BUG_ON(!skb);

                desc = &cp->rx_ring[rx_tail];
                status = le32_to_cpu(desc->opts1);
                if (status & DescOwn)
                        break;

--------------------
}

论坛徽章:
0
6 [报告]
发表于 2007-04-26 21:59 |只看该作者
原帖由 star_ice 于 2007-4-24 14:15 发表于 1楼  
NAPI通过软中断调用pool函数时,在pool循环开始时中断被打开(按道理软中断也应该是可以被硬中断打断的,否则要软中断干啥,哈哈),可试想下:假设我测试网络流量,不断向设备发包,还没进入pool循环(实质性的do工作)或 ...

应该是不能中断,poll本身是要屏蔽硬中断的~

论坛徽章:
0
7 [报告]
发表于 2007-04-27 09:15 |只看该作者
1912         while (!list_empty(&queue->poll_list)) {
1913                 struct net_device *dev;
1914
1915                 if (budget <= 0 || jiffies - start_time > 1)
1916                         goto softnet_break;
1917
1918                 local_irq_enable();
1919
1920                 dev = list_entry(queue->poll_list.next,
1921                                  struct net_device, poll_list);
1922                 have = netpoll_poll_lock(dev);
1923
1924                 if (dev->quota <= 0 || dev->poll(dev, &budget)) { /*  POLL here */
1925                         netpoll_poll_unlock(have);
1926                         local_irq_disable();
1927                         list_move_tail(&dev->poll_list, &queue->poll_list);
1928                         if (dev->quota < 0)
1929                                 dev->quota += dev->weight;
1930                         else
1931                                 dev->quota = dev->weight;
1932                 } else {
1933                         netpoll_poll_unlock(have);
1934                         dev_put(dev);
1935                         local_irq_disable();
1936                 }
1937         }

你说它是能中断,能中断,还是能中断呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP