linux核心中的通用堆栈实现

时间:2017-04-08 11:09:04

标签: c linux stack

我正在为bcache Linux模块编写补丁,并且很难在Linux核心中找到通用的LIFO实现。我在defineswithout上找到了几个FIFO实现。然而,LIFO没有任何相似之处。

哪里可以找到一个?优选C不是asm而不是基于定义,但任何都应该有效。

如果没有提供抽象LIFO,那么实现LIFO的最简单的结构是什么(例如Linux核心中的通用堆栈实现)?

1 个答案:

答案 0 :(得分:1)

如果LIFO具有固定的最大深度,并且没有动态分配,那么它就像是

#define LIFO_MAXDEPTH  16

static spinlock_t   lifo_lock = SPIN_LOCK_UNLOCKED;
static size_t       lifo_count = 0;
static struct item  lifo_entry[LIFO_MAXDEPTH];

int lifo_push(const struct item *from)
{
    spin_lock(&lifo_lock);
    if (lifo_count >= LIFO_MAXDEPTH) {
        spin_unlock(&lifo_lock);
        return -1;
    }

    lifo_entry[lifo_count++] = *from;

    spin_unlock(&lifo_lock);
    return 0;
}

int lifo_pop(struct item *to)
{
    spin_lock(&lifo_lock);
    if (lifo_count < 1) {
        spin_unlock(&lifo_lock);
        return -1;
    }

    *to = lifo_entry[--lifo_count];

    spin_unlock(&lifo_lock);
    return 0;
}

因为我们只需要将它锁定很短的持续时间,螺旋锁就足够了。

如果动态分配LIFO,事情会变得更复杂。特别是,因为我们可能需要调用kmalloc()kfree(),所以我们不能使用自旋锁。您还希望将堆栈拆分为页面大小的块,因为高阶分配可能会失败。然后你必须考虑像恶意用户试图使用该设施进行DOS攻击等等。