首页 > 其他分享 >semaphore互斥失败导致出core

semaphore互斥失败导致出core

时间:2023-09-25 14:56:21浏览次数:46  
标签:core bnet neigh 互斥 hi semaphore kev ring event

先看堆栈

 (gdb) bt
 #0  bnet_neigh_event_thread (dummy=dummy@entry=0x0) at /vob/jenkins/workspace/_build_8.8.3/sdk/src/customer_smm/l3.c:1303
 #1  0x0000000002172cb0 in thread_boot (ti_void=0x1c99dc10) at /vob_yukon/xzhou_streams/smm_88x/sdk/src/sal/core/unix/thread.c:177
 #2  0x0000ffffb7166f78 in ?? ()
 #3  0x0000ffffc7a49e30 in ?? ()

bnet_neigh_event_thread()的源码片段

1283     while (1) {
1284         if ((dumdum = casa_sem_wait(&bnet_neigh_sem))) {
1285             SWMGRLOG(" **%s: casa_sem_wait=%d?\n", __FUNCTION__, dumdum);
1286             continue;
1287         }
1288
1289         if (bnet_neigh_ring_bit_hi[bnet_neigh_read_hi])
1290         {
1291             kev = bnet_neigh_ring_hi[bnet_neigh_read_hi];
1292             high_priority_event = 1;
1293         }
1294         else if (bnet_neigh_ring_bit[bnet_neigh_read])
1295         {
1296             kev = bnet_neigh_ring[bnet_neigh_read];
1297             high_priority_event = 0;
1298         }
1299         else
1300            continue;
1301
1302         // get pointer out of ring
1303         switch (kev->event_type) {    // 此处出core
1304         case CASA_EVENT_IP4_FIB:
1305             net_fib_event_handler(kev->event,
1306                     &kev->u.casa_rt);
1307             break;
1308         case CASA_EVENT_IP6_FIB:
"l3.c" 2667L, 79013C

bnet_neigh_ring_hibnet_neigh_ring是进程初始化时预分配的缓冲池
gdb查看一下这几个值:

(gdb) p kev
$1 = (kernel_event_t *) 0x0
(gdb) p high_priority_event
$2 = 1
(gdb) p bnet_neigh_ring_bit_hi[bnet_neigh_read_hi]
$3 = 1 '\001'
(gdb) p bnet_neigh_ring_hi[bnet_neigh_read_hi]
$4 = (kernel_event_t *) 0xffff640749e8
(gdb)

从gdb打印出的内容来看,kev不应该是为NULL的

但是注意到,在源码的1684行有个sem_wait,说明时有锁保护的
那么很有可能时因为这个锁没有保护齐全,在1289行和1291行之间有调度其他线程

事实上,跟踪一下使用另外bnet_neigh_ring_bit_hibnet_neigh_ring_hi的相关代码发现,则两块缓存的保护锁是bcm_neighbor_ev_ring,而在这里并没有上锁,并且,这个锁也应该要保护bnet_neigh_read_hibnet_neigh_read_hi这两个下标,而实际上也没有保护到

改完后:


    while (1) {
        if ((dumdum = casa_sem_wait(&bnet_neigh_sem))) {
            SWMGRLOG(" **%s: casa_sem_wait=%d?\n", __FUNCTION__, dumdum);
            continue;
        }

        // Bug 171516 : protect neigh ring with semaphor `bcm_neighbor_ev_ring`;
        casa_sem_wait(&bcm_neighbor_ev_ring);
        if (bnet_neigh_ring_bit_hi[bnet_neigh_read_hi])
        {
            kev = bnet_neigh_ring_hi[bnet_neigh_read_hi];
	        high_priority_event = 1;		 
        }
        else if (bnet_neigh_ring_bit[bnet_neigh_read])
        {
            kev = bnet_neigh_ring[bnet_neigh_read];
	        high_priority_event = 0;
        }
        else
        {
            sem_post(&bcm_neighbor_ev_ring);	
            continue;
        }
        sem_post(&bcm_neighbor_ev_ring);	

        // get pointer out of ring
        switch (kev->event_type) {
        case CASA_EVENT_IP4_FIB:
            net_fib_event_handler(kev->event,
                    &kev->u.casa_rt);
            break;
        case CASA_EVENT_IP6_FIB:
            net_ip6_fib_proc( kev->event,
                    &kev->u.casa_rt);
            break;

标签:core,bnet,neigh,互斥,hi,semaphore,kev,ring,event
From: https://www.cnblogs.com/fallenmoon/p/17727933.html

相关文章

  • core文件里的全局变量偏移了16字节
    源代码里面有这个几张表:126staticstructavl_table*l2_addr_tree;127staticstructavl_table*casa_neighbor_table;128staticstructavl_table*casa_ecmp_table;129staticstructavl_table*casa_neighbor6_table;130staticstructavl_table*casa_nh_rout......
  • strncpy 出core
    core的堆栈是这样子的:(gdb)bt#00x00007ffff4a96a7cinpthread_kill()from/lib/x86_64-linux-gnu/libc.so.6#10x00007ffff4a42476inraise()from/lib/x86_64-linux-gnu/libc.so.6#20x00007ffff4a287f3inabort()from/lib/x86_64-linux-gnu/libc.so.6#30......
  • 无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/
    今天解决了一个很早之前的问题!!!无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]之前一直以为是jar包不匹配,但是改了jar包之后连uri都分辨不出来了后来在网上查到是tomcat的问题,将tomcat的conf目录下的catalina.properties的tomc......
  • asp.net core 将整个解决方案打包,做成脚手架,可直接安装使用
    自己经过多年开发的沉淀后,开发出一个属于自己的一套Demo项目,亦或是借鉴别人的项目后,优化了一个,然后我们在别的地方使用的时候(可能是下一个公司),如果还想用自己的模板,也可能是供新入职的同事使用,经常会是以下几个办法 1、对比着之前的项目结构,在VistulStudio中手动创建一个空的......
  • Linux内核信号量(semaphore)使用与源码分析
    https://blog.csdn.net/Auris/article/details/107404962一.在Linux内核驱动中使用信号量(semaphore)常规操作步骤:[0].定义信号量结构体变量;structsemaphoresem; [1].初始化信号量变量 voidsema_init(structsemaphore*sem,intn); eg.sema_ini......
  • # github.com/coreos/etcd/clientv3/balancer/resolver/endpoint
    linux使用go连接etcd集群时报错:#github.com/coreos/etcd/clientv3/balancer/resolver/endpoint/root/go/pkg/mod/github.com/coreos/[email protected]+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:114:87:undefined:resolver.BuildOption/root/go/pkg/mod/g......
  • EF Core 迁移代码
    列重命名需要自定义迁移的一个重要示例就是重命名属性时。例如,如果你将属性从 Name 重命名为 FullName,EFCore将生成以下迁移:migrationBuilder.DropColumn(name:"Name",table:"Customers");migrationBuilder.AddColumn<string>(name:"FullName",......
  • ASP.NET CORE区域LIS医学检验系统源码 SaaS模式B/S架构
    区域LIS系统源码 SaaS模式B/S架构的LIS系统源码区域LIS可促进基层医疗机构条码化检验业务管理,为基层搭建标本采集、标本核收、标本检验、室内质控、报告发布、统计分析的规范流程,同时为医疗机构提供检验诊断知识库提升检验业务水准。技术架构:ASP.NETCORE3.1MVC+SQLserver+R......
  • .netCore 图形验证码,非System.Drawing.Common
    netcore需要跨平台,说白点就是放在windows服务器要能用,放在linux服务器上也能用,甚至macos上。很多时候需要使用到图形验证码,这就有问题了。旧方案1.引入包<PackageReferenceInclude="System.Drawing.Common"Version="5.0.3"/>2.添加引用usingSystem.Drawing;usingSystem......
  • IIS下部署asp.net core应用
    问题描述:IIS下部署asp.netcore应用,windows日志中经常发现如下重启信息:改善办法:每次某应用重启后,发现应用内的缓存都过期了,于是按照如下文章和以下截图将引用程序池做相应设置,该问题得到改善:主要是将启动模式改成:AlwaysRunning,将闲置时间改成0;参考文章:https://www.mo......