dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:2514回复:10

【passthru】进入PtReceive/PtReceivePacket后会被别的进程中断吗

楼主#
更多 发布于:2003-06-14 13:42
好像ptreceive/ptreceivepacket是在dispatch level吧,我在passthru里设了个时钟,用NdisMSetPeriodicTimer设的,每秒调用一次回调函数timerfunc。我现在在timerfunc和ptreceive/ptreceivepacket里面使用了同步代码(不是spinlock),程序运行没有问题,现在为了加快速度,我想去掉同步代码,不知道会不会有问题?
baoyibao99
禁止发言
禁止发言
  • 注册日期2003-05-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分894分
  • 威望8415点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-15 21:32
用户被禁言,该主题自动屏蔽!
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-16 17:41
我做的同步是用NDIS_EVENT做的一个互斥量,以前用的fastmutex好像会出错。现在为了提高驱动的效率,我想把同步代码去掉。我觉得如果ptreceive里面都会被中断的话,那简直没天理啦 :D
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-16 22:04
我做的同步是用NDIS_EVENT做的一个互斥量,以前用的fastmutex好像会出错。现在为了提高驱动的效率,我想把同步代码去掉。我觉得如果ptreceive里面都会被中断的话,那简直没天理啦 :D

我用SOFTICE跟过无数次,从来没有被中断过了
按照我的理解ptreceive这样的函数应该是一个线程吧,线程会在运行中被同级的线程抢先吗?
答案是?Y/N?
我都糊涂了
放弃瘟草,现吃李草
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-16 22:06
好像ptreceive/ptreceivepacket是在dispatch level吧,我在passthru里设了个时钟,用NdisMSetPeriodicTimer设的,每秒调用一次回调函数timerfunc。我现在在timerfunc和ptreceive/ptreceivepacket里面使用了同步代码(不是spinlock),程序运行没有问题,现在为了加快速度,我想去掉同步代码,不知道会不会有问题?


能不能把你的代码帖出来看看,或者发给我? :D
我想看看啊
放弃瘟草,现吃李草
sinfors
驱动牛犊
驱动牛犊
  • 注册日期2003-03-18
  • 最后登录2005-01-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-16 22:08
1、在单CPU的机器上不会有问题。
2、在多CPU的机器上会出问题。条件:邦定两个Adapter以上时。

祝好运。
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-16 22:13
1、在单CPU的机器上不会有问题。
2、在多CPU的机器上会出问题。条件:邦定两个Adapter以上时。

祝好运。


能解释一下吗?》
放弃瘟草,现吃李草
baoyibao99
禁止发言
禁止发言
  • 注册日期2003-05-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分894分
  • 威望8415点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-16 23:59
用户被禁言,该主题自动屏蔽!
sinfors
驱动牛犊
驱动牛犊
  • 注册日期2003-03-18
  • 最后登录2005-01-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-17 09:03
在多处理器、多网卡的时候,Ptreceive是可以重入的。
原因:
    1、每个网卡都可以有一个中断处理程序来回调PtReceive
    2、每个CPU都可以接受一个中断。
dshadow79
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2006-04-10
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-17 16:04
这个是用ndis_event做的互斥量,因为用fastmutex好像有问题
#if NDIS_WDM
typedef struct _NDIS_MUTEX
{
NDIS_EVENT ndisEvent;
}NDIS_MUTEX, *PNDIS_MUTEX;
#define InitializeNDISMutex( mutex ) NdisInitializeEvent( &mutex.ndisEvent ); NdisSetEvent( &mutex.ndisEvent )
#define AcquireNDISMutex( mutex ) NdisWaitEvent( &mutex.ndisEvent, 0 )
#define ReleaseNDISMutex( mutex ) NdisSetEvent( &mutex.ndisEvent )
#endif

然后用NdisMInitializeTimer建立时钟,NdisMSetPeriodicTimer设置一秒一次。

然后就在ptreceivepacket和timerfunc里使用上面的同步量了。主要执行每秒一次的清理工作

好像ptreceivepacket和timerfunc都工作在dispatch level,那么这样应该不会被中断吧?

如果工作在两个cpu模式下,我也觉得需要同步量。不过不知道2000内核或者xp内核对于双cpu的支持是怎样的?我听说大多的软件都要增加为多处理器优化的代码,那ndis这层还需要增加吗?我觉得如果它内核不支持的话也没办法为多处理器优化了

谢谢楼上的讨论,等了好久了 :P
bacongong
驱动牛犊
驱动牛犊
  • 注册日期2007-10-10
  • 最后登录2009-01-12
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2008-05-24 19:31
我也遇到这个问题了,我做了一下测试,很简单,就是定义个全局变量,在PtReceive里对其自增1,而在定时器里把它置0, 结果会蓝屏!!我用的同步机制是自旋锁。
驱网无线,快乐无限
游客

返回顶部