在更改后的 CentOS 7 中构建内核模块 API

Build kernel module in CentOS 7 with changed API

我编写 NIC 模块驱动程序并实现它的基本功能,如 ndo_openndo_stopndo_start_xmit...

有时 Linux 内核 API 在最近的版本中发生了变化。所以像 LINUX_VERSION_CODE 这样的宏有助于将模块的代码采用到最近的 Linux 内核版本。在 CentOS(RHEL) 中,我遇到了改变 NIC MTU 的函数名称与 vanilla Linux 内核不同的函数名称。在 vanilla Linux 内核 v.3.10.0 中,它的原型是:

int         (*ndo_change_mtu)(struct net_device *dev,
                          int new_mtu);

但在 CentOS 7.6.1810 3.10.0-957.el7.x86_64 中是:

RH_KABI_RENAME(int      (*ndo_change_mtu),
               int      (*ndo_change_mtu_rh74))(struct net_device *dev,
                                                int new_mtu);

所以我必须使用 ndo_change_mtu_rh74 而不是 ndo_change_mtu,这正如我预期的那样有效。

是否可以使用一些宏来采用不同 Linux 内核版本之间的模块代码而不打补丁代码以防止针对 CentOS(RHEL) Linux 内核的编译错误?

感谢@omajid,他向我提供了有关 kni: Fix build on RHEL 8 的主题。下一个宏解决了我的问题:

#if (defined(RHEL_RELEASE_CODE) && \
    (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)))
    (RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)) && \
    (RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8, 0)))
#define ndo_change_mtu ndo_change_mtu_rh74
#endif