• mbuf double free


    #define RTE_ETHER_MAX_LEN   1518  /**< Maximum frame len, including CRC. */

     #define RTE_PKTMBUF_HEADROOM 128

    #define PRIV_SIZE   16
    #define MBUF_DATAROOM_SIZE (RTE_PKTMBUF_HEADROOM + RTE_ETHER_MAX_LEN)
    #define MBUF_SIZE   (sizeof(struct rte_mbuf) + PRIV_SIZE + MBUF_DATAROOM_SIZE)
    #define CACHE_SIZE  32
      mpool = rte_mempool_create("test_pool",
                                   MBUF_COUNT,
                                   MBUF_SIZE,
                                   CACHE_SIZE,
                                   sizeof(struct rte_pktmbuf_pool_private),
                                   rte_pktmbuf_pool_init,
                                   &priv,
                                   rte_pktmbuf_init,
                                   NULL,
                                   SOCKET_ID_ANY,
                                   MEMPOOL_F_SC_GET)
     mbuf_size = rte_mempool_calc_obj_size(MBUF_SIZE, 0, &objsz);
        printf("mbuf_size: %u
    ", mbuf_size);
        printf("elt_size: %u, header_size: %u, trailer_size: %u, total_size: %u
    ",
            objsz.elt_size, objsz.header_size, objsz.trailer_size, objsz.total_size);

     开启了 CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG

    mbuf_size: 2176
    elt_size: 1792, header_size: 128, trailer_size: 256, total_size: 2176
    MBUF_DATAROOM_SIZE等于1646
    RTE_PKTMBUF_HEADROOM: 128
    sizeof(mbuf): 128
    m: 0x13f8d3c00
    m->refcnt: 1
    m->buf_addr: 0x13f8d3c90
    m->data_off: 128
    m->buf_len: 1646
    m->pkt_len: 1000
    m->data_len: 1000
    m->nb_segs: 1
    m->next: (nil)
    m->buf_addr+m->data_off: 0x13f8d3d10
    rte_pktmbuf_mtod(m): 0x13f8d3d10
    rte_pktmbuf_data_len(m): 1000
    rte_pktmbuf_pkt_len(m): 1000
    rte_pktmbuf_headroom(m): 128
    rte_pktmbuf_tailroom(m): 518   ---和debug 开启无关
    rte_pktmbuf_data_room_size(mpool): 1646
    rte_pktmbuf_priv_size(mpool): 16
    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <errno.h>
    #include <sys/queue.h>
    
    #include <rte_launch.h>
    #include <rte_eal.h>
    #include <rte_per_lcore.h>
    #include <rte_lcore.h>
    #include <rte_debug.h>
    #include <rte_mempool.h>
    #include <rte_mbuf.h>
    #include <rte_ether.h>
    
    #define RAW_MEMPOOL
    
    #define MBUF_COUNT  (1024-1)
    #define PRIV_SIZE   16
    // ETH_MAX_len = 1518
    // ETH_MTU = ETH_MAX_LEN - ETH_HDR_LEN - ETHER_CRC_LEN = 1518 - 14 - 4 = 1500
    #define MBUF_DATAROOM_SIZE (RTE_PKTMBUF_HEADROOM + RTE_ETHER_MAX_LEN)
    #define MBUF_SIZE   (sizeof(struct rte_mbuf) + PRIV_SIZE + MBUF_DATAROOM_SIZE)
    #define CACHE_SIZE  32
    
    
    static void mbuf_dump(struct rte_mbuf* m)
    {
        printf("RTE_PKTMBUF_HEADROOM: %u
    ", RTE_PKTMBUF_HEADROOM);
        printf("sizeof(mbuf): %lu
    ", sizeof(struct rte_mbuf));
        printf("m: %p
    ", m);
        printf("m->refcnt: %u
    ", m->refcnt);
        printf("m->buf_addr: %p
    ", m->buf_addr);
        printf("m->data_off: %u
    ", m->data_off);
        printf("m->buf_len: %u
    ", m->buf_len);
        printf("m->pkt_len: %u
    ", m->pkt_len);
        printf("m->data_len: %u
    ", m->data_len);
        printf("m->nb_segs: %u
    ", m->nb_segs);
        printf("m->next: %p
    ", m->next);
        printf("m->buf_addr+m->data_off: %p
    ", (char*)m->buf_addr+m->data_off);
        printf("rte_pktmbuf_mtod(m): %p
    ", rte_pktmbuf_mtod(m, char*));
        printf("rte_pktmbuf_data_len(m): %u
    ", rte_pktmbuf_data_len(m));
        printf("rte_pktmbuf_pkt_len(m): %u
    ", rte_pktmbuf_pkt_len(m)); 
        printf("rte_pktmbuf_headroom(m): %u
    ", rte_pktmbuf_headroom(m));
        printf("rte_pktmbuf_tailroom(m): %u
    ", rte_pktmbuf_tailroom(m));
        printf("rte_pktmbuf_data_room_size(mpool): %u
    ", 
                    rte_pktmbuf_data_room_size(m->pool));
        printf("rte_pktmbuf_priv_size(mpool): %u
    
    ",
                    rte_pktmbuf_priv_size(m->pool));
    }
    
    static int mbuf_demo(void)
    {
        struct rte_mempool* mpool;
        struct rte_mbuf *m;
        struct rte_mempool_objsz objsz;
        uint32_t mbuf_size;
    
    #ifdef RAW_MEMPOOL
        struct rte_pktmbuf_pool_private priv;
        priv.mbuf_data_room_size = MBUF_DATAROOM_SIZE;
        priv.mbuf_priv_size = PRIV_SIZE;
    
        mpool = rte_mempool_create("test_pool",
                                   MBUF_COUNT,
                                   MBUF_SIZE,
                                   CACHE_SIZE,
                                   sizeof(struct rte_pktmbuf_pool_private),
                                   rte_pktmbuf_pool_init,
                                   &priv,
                                   rte_pktmbuf_init,
                                   NULL,
                                   SOCKET_ID_ANY,
                                   MEMPOOL_F_SC_GET);
    #else
        mpool = rte_pktmbuf_pool_create("test_pool",
                                        MBUF_COUNT,
                                        CACHE_SIZE,
                                        PRIV_SIZE,
                                        MBUF_DATAROOM_SIZE,
                                        SOCKET_ID_ANY);
    #endif
        if(NULL == mpool)
            return -1;
        
        mbuf_size = rte_mempool_calc_obj_size(MBUF_SIZE, 0, &objsz);
        printf("mbuf_size: %u
    ", mbuf_size);
        printf("elt_size: %u, header_size: %u, trailer_size: %u, total_size: %u
    ",
            objsz.elt_size, objsz.header_size, objsz.trailer_size, objsz.total_size);
    
        m = rte_pktmbuf_alloc(mpool);
            mbuf_dump(m);
        rte_pktmbuf_append(m, 1000);
        mbuf_dump(m);
    
        printf("mempool count before free: %u
    ", rte_mempool_avail_count(mpool));
        printf("before free m->refcnt: %u
    ", m->refcnt);
        rte_pktmbuf_free(m);
        printf("after free m->refcnt: %u
    ", m->refcnt);
        printf("mempool count after free: %u
    ", rte_mempool_avail_count(mpool));
        printf("=========================== mbuf double free ======================== 
    ");
        rte_pktmbuf_free(m);
        printf("after free m->refcnt: %u
    ", m->refcnt);
        printf("mempool count after free: %u
    ", rte_mempool_avail_count(mpool));
        return 0;
    }
    
    
    
    int
    main(int argc, char **argv)
    {
        int ret;
        //unsigned lcore_id;
    
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
            rte_panic("Cannot init EAL
    ");
    
        /* call on every slave lcore */
        //RTE_LCORE_FOREACH_SLAVE(lcore_id) {
        //    rte_eal_remote_launch(lcore_hello, NULL, lcore_id);:
        //}
    
        mbuf_demo();
    
        rte_eal_mp_wait_lcore();
        return 0;
    }
    [root@localhost mbuf]# build/app/helloworld -c 0xf -n 4
    EAL: Detected 128 lcore(s)
    EAL: Detected 4 NUMA nodes
    EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
    EAL: Selected IOVA mode 'PA'
    EAL: No available hugepages reported in hugepages-2048kB
    EAL: Probing VFIO support...
    EAL: VFIO support initialized
    EAL: PCI device 0000:05:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:200 net_hinic
    EAL:   using IOMMU type 1 (Type 1)
    net_hinic: Initializing pf hinic-0000:05:00.0 in primary process
    net_hinic: Device 0000:05:00.0 hwif attribute:
    net_hinic: func_idx:0, p2p_idx:0, pciintf_idx:0, vf_in_pf:0, ppf_idx:0, global_vf_id:15, func_type:2
    net_hinic: num_aeqs:4, num_ceqs:4, num_irqs:32, dma_attr:2
    net_hinic: Get public resource capability:
    net_hinic: host_id: 0x0, ep_id: 0x0, intr_type: 0x0, max_cos_id: 0x7, er_id: 0x0, port_id: 0x0
    net_hinic: host_total_function: 0xf2, host_oq_id_mask_val: 0x8, max_vf: 0x78
    net_hinic: pf_num: 0x2, pf_id_start: 0x0, vf_num: 0xf0, vf_id_start: 0x10
    net_hinic: Get share resource capability:
    net_hinic: host_pctxs: 0x0, host_cctxs: 0x0, host_scqs: 0x0, host_srqs: 0x0, host_mpts: 0x0
    net_hinic: Get l2nic resource capability:
    net_hinic: max_sqs: 0x10, max_rqs: 0x10, vf_max_sqs: 0x4, vf_max_rqs: 0x4
    net_hinic: Initialize 0000:05:00.0 in primary successfully
    EAL: PCI device 0000:06:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:200 net_hinic
    EAL: PCI device 0000:7d:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:a222 net_hns3
    EAL: PCI device 0000:7d:00.1 on NUMA socket 0
    EAL:   probe driver: 19e5:a221 net_hns3
    EAL: PCI device 0000:7d:00.2 on NUMA socket 0
    EAL:   probe driver: 19e5:a222 net_hns3
    EAL: PCI device 0000:7d:00.3 on NUMA socket 0
    EAL:   probe driver: 19e5:a221 net_hns3
    mbuf_size: 1920
    elt_size: 1792, header_size: 128, trailer_size: 0, total_size: 1920
    RTE_PKTMBUF_HEADROOM: 128
    sizeof(mbuf): 128
    m: 0x13f919c00
    m->refcnt: 1
    m->buf_addr: 0x13f919c90
    m->data_off: 128
    m->buf_len: 1646
    m->pkt_len: 0
    m->data_len: 0
    m->nb_segs: 1
    m->next: (nil)
    m->buf_addr+m->data_off: 0x13f919d10
    rte_pktmbuf_mtod(m): 0x13f919d10
    rte_pktmbuf_data_len(m): 0
    rte_pktmbuf_pkt_len(m): 0
    rte_pktmbuf_headroom(m): 128
    rte_pktmbuf_tailroom(m): 1518
    rte_pktmbuf_data_room_size(mpool): 1646
    rte_pktmbuf_priv_size(mpool): 16
    
    RTE_PKTMBUF_HEADROOM: 128
    sizeof(mbuf): 128
    m: 0x13f919c00
    m->refcnt: 1
    m->buf_addr: 0x13f919c90
    m->data_off: 128
    m->buf_len: 1646
    m->pkt_len: 1000
    m->data_len: 1000
    m->nb_segs: 1
    m->next: (nil)
    m->buf_addr+m->data_off: 0x13f919d10
    rte_pktmbuf_mtod(m): 0x13f919d10
    rte_pktmbuf_data_len(m): 1000
    rte_pktmbuf_pkt_len(m): 1000
    rte_pktmbuf_headroom(m): 128
    rte_pktmbuf_tailroom(m): 518
    rte_pktmbuf_data_room_size(mpool): 1646
    rte_pktmbuf_priv_size(mpool): 16
    
    mempool count before free: 1022
    before free m->refcnt: 1
    after free m->refcnt: 1
    mempool count after free: 1023
    =========================== mbuf double free ======================== 
    after free m->refcnt: 1
    mempool count after free: 1023

    double free没有coredump

    [root@localhost mbuf]# cat main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdint.h>
    #include <errno.h>
    #include <sys/queue.h>
    
    #include <rte_launch.h>
    #include <rte_eal.h>
    #include <rte_per_lcore.h>
    #include <rte_lcore.h>
    #include <rte_debug.h>
    #include <rte_mempool.h>
    #include <rte_mbuf.h>
    #include <rte_ether.h>
    
    #define RAW_MEMPOOL
    
    #define MBUF_COUNT  (1024-1)
    #define PRIV_SIZE   16
    // ETH_MAX_len = 1518
    // ETH_MTU = ETH_MAX_LEN - ETH_HDR_LEN - ETHER_CRC_LEN = 1518 - 14 - 4 = 1500
    #define MBUF_DATAROOM_SIZE (RTE_PKTMBUF_HEADROOM + RTE_ETHER_MAX_LEN)
    #define MBUF_SIZE   (sizeof(struct rte_mbuf) + PRIV_SIZE + MBUF_DATAROOM_SIZE)
    #define CACHE_SIZE  32
    
    
    struct rte_mempool* mpool;
    struct rte_mbuf *m = NULL;
    static void mbuf_dump(struct rte_mbuf* m)
    {
        printf("RTE_PKTMBUF_HEADROOM: %u
    ", RTE_PKTMBUF_HEADROOM);
        printf("sizeof(mbuf): %lu
    ", sizeof(struct rte_mbuf));
        printf("m: %p
    ", m);
        printf("m->refcnt: %u
    ", m->refcnt);
        printf("m->buf_addr: %p
    ", m->buf_addr);
        printf("m->data_off: %u
    ", m->data_off);
        printf("m->buf_len: %u
    ", m->buf_len);
        printf("m->pkt_len: %u
    ", m->pkt_len);
        printf("m->data_len: %u
    ", m->data_len);
        printf("m->nb_segs: %u
    ", m->nb_segs);
        printf("m->next: %p
    ", m->next);
        printf("m->buf_addr+m->data_off: %p
    ", (char*)m->buf_addr+m->data_off);
        printf("rte_pktmbuf_mtod(m): %p
    ", rte_pktmbuf_mtod(m, char*));
        printf("rte_pktmbuf_data_len(m): %u
    ", rte_pktmbuf_data_len(m));
        printf("rte_pktmbuf_pkt_len(m): %u
    ", rte_pktmbuf_pkt_len(m)); 
        printf("rte_pktmbuf_headroom(m): %u
    ", rte_pktmbuf_headroom(m));
        printf("rte_pktmbuf_tailroom(m): %u
    ", rte_pktmbuf_tailroom(m));
        printf("rte_pktmbuf_data_room_size(mpool): %u
    ", 
                    rte_pktmbuf_data_room_size(m->pool));
        printf("rte_pktmbuf_priv_size(mpool): %u
    
    ",
                    rte_pktmbuf_priv_size(m->pool));
    }
    
    static int mpool_init(void)
    {
        struct rte_mempool_objsz objsz;
        uint32_t mbuf_size;
    
    #ifdef RAW_MEMPOOL
        struct rte_pktmbuf_pool_private priv;
        priv.mbuf_data_room_size = MBUF_DATAROOM_SIZE;
        priv.mbuf_priv_size = PRIV_SIZE;
    
        mpool = rte_mempool_create("test_pool",
                                   MBUF_COUNT,
                                   MBUF_SIZE,
                                   CACHE_SIZE,
                                   sizeof(struct rte_pktmbuf_pool_private),
                                   rte_pktmbuf_pool_init,
                                   &priv,
                                   rte_pktmbuf_init,
                                   NULL,
                                   SOCKET_ID_ANY,
                                   MEMPOOL_F_SC_GET);
    #else
        mpool = rte_pktmbuf_pool_create("test_pool",
                                        MBUF_COUNT,
                                        CACHE_SIZE,
                                        PRIV_SIZE,
                                        MBUF_DATAROOM_SIZE,
                                        SOCKET_ID_ANY);
    #endif
        if(NULL == mpool)
            return -1;
        
        mbuf_size = rte_mempool_calc_obj_size(MBUF_SIZE, 0, &objsz);
        printf("mbuf_size: %u
    ", mbuf_size);
        printf("elt_size: %u, header_size: %u, trailer_size: %u, total_size: %u
    ",
            objsz.elt_size, objsz.header_size, objsz.trailer_size, objsz.total_size);
    
        return 0;
    }
    int lcore_hello()
    {
        unsigned lcore_id = rte_lcore_id();
        printf("Starting core %u
    ", lcore_id);
        if(1 == lcore_id)
        {
        m = rte_pktmbuf_alloc(mpool);
        rte_pktmbuf_append(m, 1000);
        mbuf_dump(m);
    
        printf("mempool count before free: %u
    ", rte_mempool_avail_count(mpool));
        printf("before free m->refcnt: %u
    ", m->refcnt);
        sleep(10);
        printf("after sleep dump 
    ");
        mbuf_dump(m);
        printf("after sleep m->refcnt: %u
    ", m->refcnt);
        printf("mempool count after sleep : %u
    ", rte_mempool_avail_count(mpool));
        }
        else 
        {
        while(NULL == m)
        {
             sleep(1);
        }
        printf("=========================== mbuf double free ======================== %u
    ", lcore_id);
        rte_pktmbuf_free(m);
        printf("after free m->refcnt: %u
    ", m->refcnt);
        printf("mempool count after free: %u
    ", rte_mempool_avail_count(mpool));
        }
        return 0;
    }
    
    
    
    int
    main(int argc, char **argv)
    {
        int ret;
        unsigned lcore_id;
    
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
            rte_panic("Cannot init EAL
    ");
        mpool_init();
    
        /* call on every slave lcore */
        RTE_LCORE_FOREACH_SLAVE(lcore_id) {
            rte_eal_remote_launch(lcore_hello, NULL, lcore_id);
        }
    
    
        rte_eal_mp_wait_lcore();
        return 0;
    }
    [root@localhost mbuf]# 
    EAL: Detected 128 lcore(s)
    EAL: Detected 4 NUMA nodes
    EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
    EAL: Selected IOVA mode 'PA'
    EAL: No available hugepages reported in hugepages-2048kB
    EAL: Probing VFIO support...
    EAL: VFIO support initialized
    EAL: PCI device 0000:05:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:200 net_hinic
    EAL:   using IOMMU type 1 (Type 1)
    net_hinic: Initializing pf hinic-0000:05:00.0 in primary process
    net_hinic: Device 0000:05:00.0 hwif attribute:
    net_hinic: func_idx:0, p2p_idx:0, pciintf_idx:0, vf_in_pf:0, ppf_idx:0, global_vf_id:15, func_type:2
    net_hinic: num_aeqs:4, num_ceqs:4, num_irqs:32, dma_attr:2
    net_hinic: Get public resource capability:
    net_hinic: host_id: 0x0, ep_id: 0x0, intr_type: 0x0, max_cos_id: 0x7, er_id: 0x0, port_id: 0x0
    net_hinic: host_total_function: 0xf2, host_oq_id_mask_val: 0x8, max_vf: 0x78
    net_hinic: pf_num: 0x2, pf_id_start: 0x0, vf_num: 0xf0, vf_id_start: 0x10
    net_hinic: Get share resource capability:
    net_hinic: host_pctxs: 0x0, host_cctxs: 0x0, host_scqs: 0x0, host_srqs: 0x0, host_mpts: 0x0
    net_hinic: Get l2nic resource capability:
    net_hinic: max_sqs: 0x10, max_rqs: 0x10, vf_max_sqs: 0x4, vf_max_rqs: 0x4
    net_hinic: Initialize 0000:05:00.0 in primary successfully
    EAL: PCI device 0000:06:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:200 net_hinic
    EAL: PCI device 0000:7d:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:a222 net_hns3
    EAL: PCI device 0000:7d:00.1 on NUMA socket 0
    EAL:   probe driver: 19e5:a221 net_hns3
    EAL: PCI device 0000:7d:00.2 on NUMA socket 0
    EAL:   probe driver: 19e5:a222 net_hns3
    EAL: PCI device 0000:7d:00.3 on NUMA socket 0
    EAL:   probe driver: 19e5:a221 net_hns3
    mbuf_size: 1920
    elt_size: 1792, header_size: 128, trailer_size: 0, total_size: 1920
    Starting core 1
    RTE_PKTMBUF_HEADROOM: 128
    sizeof(mbuf): 128
    m: 0x13f919c00
    m->refcnt: 1
    m->buf_addr: 0x13f919c90
    m->data_off: 128
    m->buf_len: 1646
    m->pkt_len: 1000
    m->data_len: 1000
    m->nb_segs: 1
    m->next: (nil)
    m->buf_addr+m->data_off: 0x13f919d10
    rte_pktmbuf_mtod(m): 0x13f919d10
    rte_pktmbuf_data_len(m): 1000
    rte_pktmbuf_pkt_len(m): 1000
    rte_pktmbuf_headroom(m): 128
    rte_pktmbuf_tailroom(m): 518
    rte_pktmbuf_data_room_size(mpool): 1646
    rte_pktmbuf_priv_size(mpool): 16
    
    mempool count before free: 1022
    before free m->refcnt: 1
    Starting core 2
    =========================== mbuf double free ======================== 2
    after free m->refcnt: 1
    mempool count after free: 1023
    Starting core 3
    =========================== mbuf double free ======================== 3
    after free m->refcnt: 1
    mempool count after free: 1023

    也没有coredump

    after sleep dump 
    RTE_PKTMBUF_HEADROOM: 128
    sizeof(mbuf): 128
    m: 0x13f919c00
    m->refcnt: 1
    m->buf_addr: 0x13f919c90
    m->data_off: 128
    m->buf_len: 1646
    m->pkt_len: 1000
    m->data_len: 1000
    m->nb_segs: 1
    m->next: (nil)
    m->buf_addr+m->data_off: 0x13f919d10
    rte_pktmbuf_mtod(m): 0x13f919d10
    rte_pktmbuf_data_len(m): 1000
    rte_pktmbuf_pkt_len(m): 1000
    rte_pktmbuf_headroom(m): 128
    rte_pktmbuf_tailroom(m): 518
    rte_pktmbuf_data_room_size(mpool): 1646
    rte_pktmbuf_priv_size(mpool): 16
    
    after sleep m->refcnt: 1
    mempool count after sleep : 1023

     CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG

     CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG=y

     

    elt_size: 1792, header_size: 128, trailer_size: 0, total_size: 1920
    开启 CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG=y 后,trailer_size 不等于0
    elt_size: 1792, header_size: 128, trailer_size: 256, total_size: 2176
    [root@localhost mbuf]# build/app/helloworld -c 0xf -n 4
    EAL: Detected 128 lcore(s)
    EAL: Detected 4 NUMA nodes
    EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
    EAL: Selected IOVA mode 'PA'
    EAL: No available hugepages reported in hugepages-2048kB
    EAL: Probing VFIO support...
    EAL: VFIO support initialized
    EAL: PCI device 0000:05:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:200 net_hinic
    EAL:   using IOMMU type 1 (Type 1)
    net_hinic: Initializing pf hinic-0000:05:00.0 in primary process
    net_hinic: Device 0000:05:00.0 hwif attribute:
    net_hinic: func_idx:0, p2p_idx:0, pciintf_idx:0, vf_in_pf:0, ppf_idx:0, global_vf_id:15, func_type:2
    net_hinic: num_aeqs:4, num_ceqs:4, num_irqs:32, dma_attr:2
    net_hinic: Get public resource capability:
    net_hinic: host_id: 0x0, ep_id: 0x0, intr_type: 0x0, max_cos_id: 0x7, er_id: 0x0, port_id: 0x0
    net_hinic: host_total_function: 0xf2, host_oq_id_mask_val: 0x8, max_vf: 0x78
    net_hinic: pf_num: 0x2, pf_id_start: 0x0, vf_num: 0xf0, vf_id_start: 0x10
    net_hinic: Get share resource capability:
    net_hinic: host_pctxs: 0x0, host_cctxs: 0x0, host_scqs: 0x0, host_srqs: 0x0, host_mpts: 0x0
    net_hinic: Get l2nic resource capability:
    net_hinic: max_sqs: 0x10, max_rqs: 0x10, vf_max_sqs: 0x4, vf_max_rqs: 0x4
    net_hinic: Initialize 0000:05:00.0 in primary successfully
    EAL: PCI device 0000:06:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:200 net_hinic
    EAL: PCI device 0000:7d:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:a222 net_hns3
    EAL: PCI device 0000:7d:00.1 on NUMA socket 0
    EAL:   probe driver: 19e5:a221 net_hns3
    EAL: PCI device 0000:7d:00.2 on NUMA socket 0
    EAL:   probe driver: 19e5:a222 net_hns3
    EAL: PCI device 0000:7d:00.3 on NUMA socket 0
    EAL:   probe driver: 19e5:a221 net_hns3
    mbuf_size: 2176
    elt_size: 1792, header_size: 128, trailer_size: 256, total_size: 2176
    Starting core 1
    RTE_PKTMBUF_HEADROOM: 128
    sizeof(mbuf): 128
    m: 0x13f8d3c00
    m->refcnt: 1
    m->buf_addr: 0x13f8d3c90
    m->data_off: 128
    m->buf_len: 1646
    m->pkt_len: 1000
    m->data_len: 1000
    m->nb_segs: 1
    m->next: (nil)
    m->buf_addr+m->data_off: 0x13f8d3d10
    rte_pktmbuf_mtod(m): 0x13f8d3d10
    rte_pktmbuf_data_len(m): 1000
    rte_pktmbuf_pkt_len(m): 1000
    rte_pktmbuf_headroom(m): 128
    rte_pktmbuf_tailroom(m): 518
    rte_pktmbuf_data_room_size(mpool): 1646
    rte_pktmbuf_priv_size(mpool): 16
    
    mempool count before free: 1022
    before free m->refcnt: 1
    Starting core 2
    =========================== mbuf double free ======================== 2
    after free m->refcnt: 1
    mempool count after free: 1023
    Starting core 3
    =========================== mbuf double free ======================== 3
    MEMPOOL: obj=0x13f8d3c00, mempool=0x13fae2c00, cookie=f2eef2eedadd2e55
    PANIC in rte_mempool_check_cookies():
    MEMPOOL: bad header cookie (put)
    8: [/lib64/libc.so.6(+0xdf690) [0xffff80fdf690]]
    7: [/lib64/libpthread.so.0(+0x7d38) [0xffff81097d38]]
    6: [build/app/helloworld(eal_thread_loop+0x324) [0x598e18]]
    5: [build/app/helloworld(lcore_hello+0x158) [0x46637c]]
    4: [build/app/helloworld() [0x465c2c]]
    3: [build/app/helloworld(rte_mempool_check_cookies+0xf4) [0x58b4c8]]
    2: [build/app/helloworld(__rte_panic+0xcc) [0x5a0c6c]]
    1: [build/app/helloworld(rte_dump_stack+0x1c) [0x5a0b18]]
    Aborted

    demo2

    先申请mbuf,后free,再申请,看两次mbuf的地址是否一样

    int lcore_hello()
    {
        printf("mempool count  : %u
    ", rte_mempool_avail_count(mpool));
        unsigned lcore_id = rte_lcore_id();
        printf("Starting core %u
    ", lcore_id);
        if(1 == lcore_id)
        {
        m = rte_pktmbuf_alloc(mpool);
        rte_pktmbuf_append(m, 1000);
        mbuf_dump(m);
        rte_pktmbuf_free(m);
        printf("mempool count  : %u
    ", rte_mempool_avail_count(mpool));
        m = rte_pktmbuf_alloc(mpool);
        rte_pktmbuf_append(m, 1000);
        mbuf_dump(m);
        rte_pktmbuf_free(m);
        }
        else 
        {
        }
        return 0;
    }
    [root@localhost mbuf]# build/app/helloworld -c 0x3 -n 4
    EAL: Detected 128 lcore(s)
    EAL: Detected 4 NUMA nodes
    EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
    EAL: Selected IOVA mode 'PA'
    EAL: No available hugepages reported in hugepages-2048kB
    EAL: Probing VFIO support...
    EAL: VFIO support initialized
    EAL: PCI device 0000:05:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:200 net_hinic
    EAL:   using IOMMU type 1 (Type 1)
    net_hinic: Initializing pf hinic-0000:05:00.0 in primary process
    net_hinic: Device 0000:05:00.0 hwif attribute:
    net_hinic: func_idx:0, p2p_idx:0, pciintf_idx:0, vf_in_pf:0, ppf_idx:0, global_vf_id:15, func_type:2
    net_hinic: num_aeqs:4, num_ceqs:4, num_irqs:32, dma_attr:2
    net_hinic: Get public resource capability:
    net_hinic: host_id: 0x0, ep_id: 0x0, intr_type: 0x0, max_cos_id: 0x7, er_id: 0x0, port_id: 0x0
    net_hinic: host_total_function: 0xf2, host_oq_id_mask_val: 0x8, max_vf: 0x78
    net_hinic: pf_num: 0x2, pf_id_start: 0x0, vf_num: 0xf0, vf_id_start: 0x10
    net_hinic: Get share resource capability:
    net_hinic: host_pctxs: 0x0, host_cctxs: 0x0, host_scqs: 0x0, host_srqs: 0x0, host_mpts: 0x0
    net_hinic: Get l2nic resource capability:
    net_hinic: max_sqs: 0x10, max_rqs: 0x10, vf_max_sqs: 0x4, vf_max_rqs: 0x4
    net_hinic: Initialize 0000:05:00.0 in primary successfully
    EAL: PCI device 0000:06:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:200 net_hinic
    EAL: PCI device 0000:7d:00.0 on NUMA socket 0
    EAL:   probe driver: 19e5:a222 net_hns3
    EAL: PCI device 0000:7d:00.1 on NUMA socket 0
    EAL:   probe driver: 19e5:a221 net_hns3
    EAL: PCI device 0000:7d:00.2 on NUMA socket 0
    EAL:   probe driver: 19e5:a222 net_hns3
    EAL: PCI device 0000:7d:00.3 on NUMA socket 0
    EAL:   probe driver: 19e5:a221 net_hns3
    mbuf_size: 2176
    elt_size: 1792, header_size: 128, trailer_size: 256, total_size: 2176
    mempool count  : 1023
    Starting core 1
    RTE_PKTMBUF_HEADROOM: 128
    sizeof(mbuf): 128
    m: 0x13f8d3c00
    m->refcnt: 1
    m->buf_addr: 0x13f8d3c90
    m->data_off: 128
    m->buf_len: 1646
    m->pkt_len: 1000
    m->data_len: 1000
    m->nb_segs: 1
    m->next: (nil)
    m->buf_addr+m->data_off: 0x13f8d3d10
    rte_pktmbuf_mtod(m): 0x13f8d3d10
    rte_pktmbuf_data_len(m): 1000
    rte_pktmbuf_pkt_len(m): 1000
    rte_pktmbuf_headroom(m): 128
    rte_pktmbuf_tailroom(m): 518
    rte_pktmbuf_data_room_size(mpool): 1646
    rte_pktmbuf_priv_size(mpool): 16
    
    mempool count  : 1023
    RTE_PKTMBUF_HEADROOM: 128
    sizeof(mbuf): 128
    m: 0x13f8d3c00
    m->refcnt: 1
    m->buf_addr: 0x13f8d3c90
    m->data_off: 128
    m->buf_len: 1646
    m->pkt_len: 1000
    m->data_len: 1000
    m->nb_segs: 1
    m->next: (nil)
    m->buf_addr+m->data_off: 0x13f8d3d10
    rte_pktmbuf_mtod(m): 0x13f8d3d10
    rte_pktmbuf_data_len(m): 1000
    rte_pktmbuf_pkt_len(m): 1000
    rte_pktmbuf_headroom(m): 128
    rte_pktmbuf_tailroom(m): 518
    rte_pktmbuf_data_room_size(mpool): 1646
    rte_pktmbuf_priv_size(mpool): 16
    
    [root@localhost mbuf]# 

    https://mmi.hatenablog.com/?page=1499611785

  • 相关阅读:
    PhysX3 User Guide 04 Rigid Body Dynamics
    PhysX3 User Guide 05 Scene Queries
    PhysX3 User Guide 01 基础
    error C2061: syntax error : identifier '__RPC__out_xcount_part'
    vim中替换字符串
    Linker Tools Warning LNK4098
    PhysX3 User Guide 03 Joint
    【转】C RunTime Library 暨 深入理解编译选项的含义 04
    不足
    tortoiseSVN Check out正常但Show Log时 Go Offline
  • 原文地址:https://www.cnblogs.com/dream397/p/14890159.html
Copyright © 2020-2023  润新知