kmalloc връща един и същи адрес отново и отново [Linux 2.4]

Работя върху някакъв код в ядрото на Linux (2.4) и по някаква причина kmalloc връща същия адрес (вярвам, че това се случва само след средата на теста). Проверих дали няма извиквания към kfree между извикванията към kmalloc (т.е. паметта все още се използва).

може би нямам памет? (kmalloc не върна NULL...)

някакви идеи как може да се случи такова нещо?

благодаря предварително за помощта!

код:

typedef struct
{
    char* buffer;
    int read_count;
    int write_count;
    struct semaphore read_sm;
    struct semaphore write_sm;
    int reader_ready;
    int writer_ready;
    int createTimeStamp;
} data_buffer_t ;

typedef struct vsf_t vsf_t;

struct vsf_t
{
    int minor;
    int type;
    int open_count;
    int waiting_pid;
    data_buffer_t* data;
    list_t proc_list;
    vsf_t* otherSide_vsf;
    int real_create_time_stamp;
};

int create_vsf(struct inode *inode, struct file *filp, struct vsf_command_parameters* parms)
{
...
    buff_data = allocate_buffer();
    if (buff_data == NULL)
    {
        kfree(this_vsfRead);
        kfree(this_vsfWrite);
        return -ENOMEM;
    }
...
}

data_buffer_t* allocate_buffer()
{
...
    data_buffer_t* this_buff = (data_buffer_t*)kmalloc(sizeof(data_buffer_t), GFP_KERNEL);
    if (this_buff == NULL)
    {
        printk( KERN_WARNING "failure at allocating memory\n" );
        return NULL;
    }
...
return this_buff;
}

*Отпечатвам след всеки kmalloc и kfree, абсолютно съм сигурен, че не се извиква kfree между kmalloc (които връщат същия адрес)


person Belgi    schedule 23.06.2011    source източник


Отговори (1)


Не знам как изглеждат структурите от данни на kmalloc, но можете да си представите, че това се случва, ако предишно двойно освобождаване причини цикъл в свързан списък с буфери. По-нататъшните освобождавания все още могат да се свързват към допълнителни отделни буфери (които могат да бъдат преразпределени), но след като те бъдат изчерпани, последният буфер ще бъде върнат за неопределено време.

person Ben Jackson    schedule 23.06.2011