AC_DEFINE([_PATH_BTMP], ["/var/log/btmp"], [log for bad login attempts])
AC_DEFINE([USE_BTMP])
AC_DEFINE([LINUX_OOM_ADJUST], [1], [Adjust Linux out-of-memory killer])
+ AC_ARG_WITH([linux-memlock-onfault],
+ [ --with-linux-memlock-onfault Enables memory locking on Linux],
+ [
+ if test "x$withval" != "xno" ; then
+ AC_MSG_CHECKING([for MCL_ONFAULT])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+ [[ #include <sys/mman.h> ]],
+ [[ mlockall(MCL_FUTURE | MCL_ONFAULT); ]],
+ )],
+ [
+ AC_MSG_RESULT([supported])
+ AC_DEFINE([LINUX_MEMLOCK_ONFAULT], [1],
+ [Lock all memory to protect sshd against Linux kcompactd] )],
+ [
+ AC_MSG_RESULT([not supported])
+ AC_MSG_ERROR([MCL_ONFAULT is not available on your system])
+ ])
+ fi
+ ],
+ )
+
AC_DEFINE([SYSTEMD_NOTIFY], [1], [Have sshd notify systemd on start/reload])
inet6_default_4in6=yes
case `uname -r` in
}
#endif /* LINUX_OOM_ADJUST */
+#ifdef LINUX_MEMLOCK_ONFAULT
+#include <sys/mman.h>
+
+void
+memlock_onfault_setup(void)
+{
+ if (mlockall(MCL_CURRENT | MCL_FUTURE | MCL_ONFAULT) < 0)
+ verbose("unable to lock memory: %s", strerror(errno));
+ else
+ debug("memory locked");
+}
+#endif /* LINUX_MEMLOCK_ONFAULT */
+
#ifdef SYSTEMD_NOTIFY
static void ssh_systemd_notify(const char *, ...)
void oom_adjust_setup(void);
#endif
+#ifdef LINUX_MEMLOCK_ONFAULT
+void memlock_onfault_setup(void);
+#endif
+
#ifdef SYSTEMD_NOTIFY
void ssh_systemd_notify_ready(void);
void ssh_systemd_notify_reload(void);
/* Adjust out-of-memory killer so listening process is not killed */
oom_adjust_setup();
#endif
+#ifdef LINUX_MEMLOCK_ONFAULT
+ /*
+ * Protect ourselves against kcompactd so that we are able to process
+ * new connections while it is active and migrating pages.
+ */
+ memlock_onfault_setup();
+#endif
}
void
void platform_pre_session_start(void)
{
+#ifdef LINUX_MEMLOCK_ONFAULT
+ /*
+ * Memlock flags are dropped on fork, lock the memory again so that the
+ * child connection is also protected against kcompactd.
+ */
+ memlock_onfault_setup();
+#endif
}