7

很偶然地在内核丛林中偶然发现了一些代码并且有点困惑。有两种实现kzalloc():在tools/virtio/linux/kernel.h和主要的linux/slab.h 中。显然,在大多数情况下使用第二个。但有时会使用“virtio” kzalloc()

“virtio”kzalloc()看起来像这样:

static inline void *kzalloc(size_t s, gfp_t gfp)
{
    void *p = kmalloc(s, gfp);

    memset(p, 0, s);
    return p;
}

我的困惑是kmalloc()“工具”目录中使用的“假”可以返回 NULL 指针。此外,看起来memset()实现不检查 NULL 指针,因此可能存在 NULL 指针取消引用。这是一个错误还是我错过了什么?

4

2 回答 2

3

header 主要用于用户空间测试,例如virtio_test.

从 git-log 中tools/virtio/virtio_test.c

这是该工具的用户空间部分:它包括一堆用于 linux API 的存根,有点类似于 linuxsched。这使得在用户空间中重新编译环代码成为可能。

结合 vhost_test 模块实现了一个小测试示例。

所以是的,代码有点不安全(干净的编码会NULL在之前测试一个指针,memset()并使用适当的错误消息退出),但由于它只是一个测试工具,跳过这个测试似乎被认为是不重要的。

于 2020-01-17T12:53:58.600 回答
3

是的,这绝对看起来像一个错误。

tools/子目录是用户空间工具的集合(顾名思义)。您还可以通过包含几个 C 标准库头文件这一事实来了解这一点。所以这当然不是内核错误(那会非常糟糕),只是virtio测试工具中的一个小疏忽。

virtio测试工具似乎重新定义了一些内核 API 来模拟它们在用户空间中的行为。尽管该功能似乎从未在实践中使用过,只是被定义。

marco:~/git/linux/tools/virtio$ grep -r kzalloc
linux/kernel.h:static inline void *kzalloc(size_t s, gfp_t gfp)
ringtest/ptr_ring.c:static inline void *kzalloc(unsigned size, gfp_t flags)
marco:~/git/linux/tools/virtio$

它可能是供希望在用户空间中测试一些 virtio 内核代码的人使用的。


在任何情况下,您都可以尝试报告错误。该get_mantainer.pl脚本建议:

$ perl scripts/get_maintainer.pl -f tools/virtio/linux/kernel.h
Bad divisor in main::vcs_assign: 0
"Michael S. Tsirkin" <mst@redhat.com> (maintainer:VIRTIO CORE AND NET DRIVERS)
Jason Wang <jasowang@redhat.com> (maintainer:VIRTIO CORE AND NET DRIVERS)
virtualization@lists.linux-foundation.org (open list:VIRTIO CORE AND NET DRIVERS)
linux-kernel@vger.kernel.org (open list)
于 2020-01-17T12:58:48.423 回答