使用一些新功能编译内核时出错

时间:2016-11-16 14:01:21

标签: linux-kernel kernel

我正在尝试使用some patches编译内核版本4.1(向GRO添加一些功能)。我来自硬件背景,相对较新的网络堆栈。我想知道如何解决这个问题,或者至少知道如何解决这个问题。

这就是我做的事情

IX

当我尝试编译它们时,我收到以下错误

# my temp location

mdkir kern
cd kern

# cloned the juggler and linux 4.1 tree

git clone https://github.com/gengyl08/juggler.git
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.1.tar.gz
tar -xvf linux-4.1.tar.gz

# copied just the essential files that were diffferent

cp juggler/linux-4.1/include/linux/netdevice.h linux-4.1/include/linux/netdevice.h
cp juggler/linux-4.1/include/linux/skbuff.h linux-4.1/include/linux/skbuff.h
cp juggler/linux-4.1/net/core/dev.c linux-4.1/net/core/dev.c
cp juggler/linux-4.1/net/core/net-sysfs.c linux-4.1/net/core/net-sysfs.c
cp juggler/linux-4.1/net/core/skbuff.c linux-4.1/net/core/skbuff.c
cp juggler/linux-4.1/net/ipv4/af_inet.c linux-4.1/net/ipv4/af_inet.c
cp juggler/linux-4.1/net/ipv4/tcp_offload.c linux-4.1/net/ipv4/tcp_offload.c

cd linux-4.1
make menuconfig   # generated the default .config file

# building the kernel

time make

1 个答案:

答案 0 :(得分:1)

看起来MAX_SKB_FRAGS太大了,以太网驱动程序不喜欢它。

From drivers/net/ethernet/agere/et131x.c

/* Part of the optimizations of this send routine restrict us to
 * sending 24 fragments at a pass.  In practice we should never see
 * more than 5 fragments.
 */

/* nr_frags should be no more than 18. */
BUILD_BUG_ON(MAX_SKB_FRAGS + 1 > 23);

来自您正在使用的补丁:

linux-3.18.5/include/linux/skbuff.h

#if (65536/PAGE_SIZE + 1) < 16
#define MAX_SKB_FRAGS 16UL
#else
#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1)
#endif

linux-4.1/include/linux/skbuff.h

#if (65536/PAGE_SIZE + 1) < 45
#define MAX_SKB_FRAGS 45UL
#else
#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 1)
#endif

请注意区别。

我还没有分析过这段代码,但从第一眼看,我发现有些不一致。

45 替换回 16 应该可以解决问题。当然,补丁作者可能会选择更高的值。