# SPDX-License-Identifier: LGPL-2.1-or-later
 # SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
+# SPDX-FileCopyrightText: 2024 Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
 
-import os
-from distutils.version import LooseVersion
+from .system import check_kernel_version
 
-required_kernel_version = LooseVersion("5.19.0")
-current_version = LooseVersion(os.uname().release.split("-")[0])
+_required_kernel_version = (5, 19, 0)
 
-if current_version < required_kernel_version:
+if not check_kernel_version(*_required_kernel_version):
     raise NotImplementedError(
-        f"linux kernel version must be at least {required_kernel_version} - got {current_version}"
+        f"linux kernel version must be at least v{'.'.join([str(i) for i in _required_kernel_version])}"
     )
 
 # SPDX-License-Identifier: GPL-2.0-or-later
 # SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
 
-from ._ext import set_process_name
+from ._ext import check_kernel_version, set_process_name
 
-__all__ = ["set_process_name"]
+__all__ = ["check_kernel_version", "set_process_name"]
 
 // SPDX-License-Identifier: LGPL-2.1-or-later
 // SPDX-FileCopyrightText: 2022 Bartosz Golaszewski <brgl@bgdev.pl>
+// SPDX-FileCopyrightText: 2024 Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
 
 #include <Python.h>
+#include <linux/version.h>
 #include <sys/prctl.h>
+#include <sys/utsname.h>
 
 static PyObject *
 module_set_process_name(PyObject *Py_UNUSED(self), PyObject *args)
        Py_RETURN_NONE;
 }
 
+static PyObject *
+module_check_kernel_version(PyObject *Py_UNUSED(self), PyObject *args)
+{
+       unsigned int req_maj, req_min, req_rel, curr_maj, curr_min, curr_rel;
+       struct utsname un;
+       int ret;
+
+       ret = PyArg_ParseTuple(args, "III", &req_maj, &req_min, &req_rel);
+       if (!ret)
+               return NULL;
+
+       ret = uname(&un);
+       if (ret)
+               return PyErr_SetFromErrno(PyExc_OSError);
+
+       ret = sscanf(un.release, "%u.%u.%u", &curr_maj, &curr_min, &curr_rel);
+       if (ret != 3) {
+               PyErr_SetString(PyExc_RuntimeError,
+                               "invalid linux version read from the kernel");
+               return NULL;
+       }
+
+       if (KERNEL_VERSION(curr_maj, curr_min, curr_rel) <
+           KERNEL_VERSION(req_maj, req_min, req_rel))
+               Py_RETURN_FALSE;
+
+       Py_RETURN_TRUE;
+}
+
 static PyMethodDef module_methods[] = {
        {
                .ml_name = "set_process_name",
                .ml_meth = (PyCFunction)module_set_process_name,
                .ml_flags = METH_VARARGS,
        },
+       {
+               .ml_name = "check_kernel_version",
+               .ml_meth = (PyCFunction)module_check_kernel_version,
+               .ml_flags = METH_VARARGS,
+       },
        { }
 };