#include <string.h>
#include <unistd.h>
-#include <common/kernel-ctl/kernel-ctl.h>
-#include <common/lttngerr.h>
#include <common/common.h>
+#include <common/kernel-ctl/kernel-ctl.h>
#include "kernel.h"
+#include "kern-modules.h"
/*
* Add context on a kernel channel.
error:
return -1;
}
+
+/*
+ * Get kernel version and validate it.
+ */
+int kernel_validate_version(int tracer_fd)
+{
+ int ret;
+ struct lttng_kernel_tracer_version version;
+
+ ret = kernctl_tracer_version(tracer_fd, &version);
+ if (ret < 0) {
+ ERR("Failed at getting the lttng-modules version");
+ goto error;
+ }
+
+ /* Validate version */
+ if (version.version != KERN_MODULES_PRE_VERSION
+ && version.version != KERN_MODULES_VERSION) {
+ goto error_version;
+ }
+
+ DBG2("Kernel tracer version validated (major version %d)", version.version);
+ return 0;
+
+error_version:
+ ERR("Kernel major version %d is not compatible (supporting <= %d)",
+ version.version, KERN_MODULES_VERSION)
+ ret = -1;
+
+error:
+ return ret;
+}
+
+/*
+ * Kernel work-arounds called at the start of sessiond main().
+ */
+int init_kernel_workarounds(void)
+{
+ int ret;
+ FILE *fp;
+
+ /*
+ * boot_id needs to be read once before being used concurrently
+ * to deal with a Linux kernel race. A fix is proposed for
+ * upstream, but the work-around is needed for older kernels.
+ */
+ fp = fopen("/proc/sys/kernel/random/boot_id", "r");
+ if (!fp) {
+ goto end_boot_id;
+ }
+ while (!feof(fp)) {
+ char buf[37] = "";
+
+ ret = fread(buf, 1, sizeof(buf), fp);
+ if (ret < 0) {
+ /* Ignore error, we don't really care */
+ }
+ }
+ fclose(fp);
+end_boot_id:
+
+ return 0;
+}