Linux SLAB_CTOR_VERIFY并缓存未声明

时间:2012-08-28 11:43:54

标签: linux linux-kernel linux-device-driver embedded-linux kernel

我尝试编译一个程序,作为存储分配如何工作的一个例子。

编译器给我一个错误,'cache'和'SLAB_CTOR_VERIFY'未声明。

我在整个内核项目(Linux Kernel 2.6.32)中找不到声明。

也许有一些替代品或类似的东西。

我在网上没有发现任何相关内容,但也许你们中的一些人可以给我一些线索。

这是源代码:

#include <linux/module.h>
#include <linux/completion.h>
#include <linux/slab.h>

static int thread_id=0;
static DECLARE_COMPLETION( on_exit );
static kmem_cache_t *cache;

struct linobj {
    int dummy_i, dummy_j, dummy_k;
    char dummy_feld[250];
    wait_queue_head_t wq;
};

static void linobj_destructor(void *objp, kmem_cache_t *cache,
    unsigned long flags)
{
    printk("linobj_destructor( %p )\n", objp);
    return;
}

static void linobj_constructor(void *objp, kmem_cache_t *cache,
       unsigned long flags)
{
    struct linobj *ptr = (struct linobj *)objp;
    if( flags & SLAB_CTOR_VERIFY )
        return;
    printk("linobj_constructor( %p )\n", objp);
    init_waitqueue_head(&ptr->wq);
    return;
}

static int thread_code( void *data )
{
    unsigned long timeout, retvalue;
    int i;
    struct linobj *obj;

    daemonize("linobj-test");
    allow_signal( SIGTERM );
    for( i=0; i<5; i++ ) {
        obj = (struct linobj *)kmem_cache_alloc( cache, GFP_KERNEL );
        printk("objadr=%p\n", obj );
        timeout=HZ;
        retvalue=schedule_timeout_interruptible(timeout);
        kmem_cache_free( cache, obj );
        if( retvalue )
            break;
    }
    complete_and_exit( &on_exit, 0 );
}

static int __init slab_init(void)
{
    cache = kmem_cache_create( "linobj", sizeof(struct linobj),
        0, 0, linobj_constructor, linobj_destructor );
    if( !cache )
        return -EFAULT;
    thread_id=kernel_thread( thread_code, NULL, CLONE_KERNEL );
    if( thread_id==0 ) {
        kmem_cache_destroy( cache );
        return -EIO;
    }
    return 0;
}

static void __exit slab_exit(void)
{
    kill_pid( find_vpid(thread_id), SIGTERM, 1 );
    wait_for_completion( &on_exit );
    if( cache )
        kmem_cache_destroy( cache );
}

module_init( slab_init );
module_exit( slab_exit );

MODULE_LICENSE("GPL");

提前致谢

彼得

2 个答案:

答案 0 :(得分:1)

2.6.22

中删除了SLAB_CTOR_VERIFY

答案 1 :(得分:0)

通过一些更改进行编译。 SLAB ..已被删除,kmem_cache函数已被更改。 kmem_cache_t已替换为struct kmem_cache

#include <linux/module.h>
#include <linux/completion.h>
#include <linux/slab.h>
#include <linux/sched.h> // daemonize

static int thread_id=0;
static DECLARE_COMPLETION( on_exit );
typedef struct kmem_cache kmem_cache_t; //
static kmem_cache_t *cache;

struct linobj {
    int dummy_i, dummy_j, dummy_k;
    char dummy_feld[250];
    wait_queue_head_t wq; 
};

static void linobj_destructor(void *objp, kmem_cache_t *cache,
    unsigned long flags)
{
    printk("linobj_destructor( %p )\n", objp);
    return;
}

static void linobj_constructor(void *objp) {
    struct linobj *ptr = (struct linobj *)objp;
    printk("linobj_constructor( %p )\n", objp);
    init_waitqueue_head(&ptr->wq);
    return;
}

static int thread_code( void *data )
{
    unsigned long timeout, retvalue;
    int i;
    struct linobj *obj;

    daemonize("linobj-test");
    allow_signal( SIGTERM );

    for( i=0; i<5; i++ ) {
        obj = (struct linobj *)kmem_cache_alloc( cache, GFP_KERNEL );
        printk("objadr=%p\n", obj );
        timeout=HZ;
        retvalue=schedule_timeout_interruptible(timeout);
        kmem_cache_free( cache, obj );
        if( retvalue )
            break;
    }
    complete_and_exit( &on_exit, 0 );
}

static int __init slab_init(void)
{
    cache = kmem_cache_create( "linobj", sizeof(struct linobj),
          0, 0, linobj_constructor);
    if( !cache )
        return -EFAULT;
    thread_id=kernel_thread( thread_code, NULL, CLONE_KERNEL );
    if( thread_id==0 ) {
        kmem_cache_destroy( cache );
        return -EIO;
    }
    return 0;
}

static void __exit slab_exit(void)
{
    kill_pid( find_vpid(thread_id), SIGTERM, 1 );
    wait_for_completion( &on_exit );
    if( cache )
        kmem_cache_destroy( cache );
}

module_init( slab_init );
module_exit( slab_exit );

MODULE_LICENSE("GPL");