=== added file 'debian/patches/95_hide_x11_sessions_with_nvidia_kms.patch'
--- debian/patches/95_hide_x11_sessions_with_nvidia_kms.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/95_hide_x11_sessions_with_nvidia_kms.patch	2017-08-24 09:08:19 +0000
@@ -0,0 +1,255 @@
+From 06a4117ae5761c184c2c9fe54e4f297becf1d2a9 Mon Sep 17 00:00:00 2001
+From: Alberto Milone <alberto.milone@canonical.com>
+Date: Tue, 20 Jun 2017 16:49:10 +0200
+Subject: [PATCH 1/1] Hide X11 sessions when KMS is enabled in the nvidia
+ driver
+
+Fixes LP: #1697882
+---
+ common/gdm-common.c                | 78 ++++++++++++++++++++++++++++++++++++++
+ common/gdm-common.h                |  2 +
+ daemon/gdm-display.c               | 10 +++++
+ daemon/gdm-local-display-factory.c |  5 +++
+ daemon/gdm-session.c               |  6 ++-
+ libgdm/Makefile.am                 |  3 ++
+ libgdm/gdm-sessions.c              |  8 +++-
+ 7 files changed, 109 insertions(+), 3 deletions(-)
+
+diff --git a/common/gdm-common.c b/common/gdm-common.c
+index 31fc810..0dcbbe2 100644
+--- a/common/gdm-common.c
++++ b/common/gdm-common.c
+@@ -47,6 +47,8 @@
+ 
+ G_DEFINE_QUARK (gdm-common-error, gdm_common_error);
+ 
++int nvidia_has_kms = -1;
++
+ const char *
+ gdm_make_temp_dir (char *template)
+ {
+@@ -797,3 +799,79 @@ gdm_shell_expand (const char *str,
+         }
+         return g_string_free (s, FALSE);
+ }
++
++static gboolean
++is_module_loaded (const char *module) {
++        char              line[4096];
++        gboolean          status = FALSE;
++        FILE              *file = NULL;
++        const char        *modules_file = "/proc/modules";
++
++        file = fopen (modules_file, "r");
++        if (!file) {
++                g_debug ("Failed to parse %s\n", modules_file);
++                return status;
++        }
++
++        while (fgets (line, sizeof (line), file)) {
++                char *tok;
++                tok = strtok (line, " \t");
++                if (strstr (tok, module) != NULL) {
++                        status = TRUE;
++                        break;
++                }
++        }
++        fclose(file);
++
++        return status;
++}
++
++gboolean
++is_nvidia_kms_available (void)
++{
++        gsize             length;
++        GError            *error = NULL;
++        gboolean          status = FALSE;
++        gchar             *contents = NULL;
++        const char        *kms_file = "/sys/module/nvidia_drm/parameters/modeset";
++
++        g_debug ("Checking if the NVIDIA driver is loaded, and has KMS enabled\n");
++
++        /* Use the cached value */
++        if (nvidia_has_kms > -1) {
++                g_debug ("is_nvidia_kms_available: using cached value %d\n", nvidia_has_kms);
++                return (nvidia_has_kms == 1);
++        }
++
++        /* Let's leave hybrid graphics alone */
++        if (is_module_loaded ("i915")) {
++                g_debug ("is_nvidia_kms_available: Intel detected, doing nothing.\n");
++                goto end;
++        }
++
++        if (!g_file_test (kms_file, G_FILE_TEST_EXISTS)) {
++                g_debug ("is_nvidia_kms_available: Cannot access '%s'", kms_file);
++                goto end;
++        }
++
++        if (!g_file_get_contents (kms_file, &contents, &length, &error)) {
++                g_debug ("is_nvidia_kms_available: Failed to parse '%s': %s",
++                         kms_file,
++                         (error && error->message) ? error->message : "(null)");
++                g_error_free (error);
++                goto end;
++        }
++
++        g_debug ("is_nvidia_kms_available: contents, \n%s\n", contents);
++
++        status = (strstr (contents, "Y\n") != NULL);
++        g_free (contents);
++
++end:
++        /* Cache the value */
++        nvidia_has_kms = status ? 1 : 0;
++
++        g_debug ("is_nvidia_kms_available: setting status to %d\n", status);
++
++        return status;
++}
+diff --git a/common/gdm-common.h b/common/gdm-common.h
+index 8d83a12..6f88f2f 100644
+--- a/common/gdm-common.h
++++ b/common/gdm-common.h
+@@ -71,6 +71,8 @@ char *        gdm_shell_expand            (const char *str,
+                                            GdmExpandVarFunc expand_func,
+                                            gpointer user_data);
+ 
++gboolean      is_nvidia_kms_available     (void);
++
+ G_END_DECLS
+ 
+ #endif /* _GDM_COMMON_H */
+diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
+index 0057e2c..42648f9 100644
+--- a/daemon/gdm-display.c
++++ b/daemon/gdm-display.c
+@@ -54,6 +54,8 @@
+ 
+ #define GDM_DISPLAY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_DISPLAY, GdmDisplayPrivate))
+ 
++extern int nvidia_has_kms;
++
+ struct GdmDisplayPrivate
+ {
+         char                 *id;
+@@ -118,6 +120,7 @@ enum {
+         PROP_DOING_INITIAL_SETUP,
+ };
+ 
++
+ static void     gdm_display_class_init  (GdmDisplayClass *klass);
+ static void     gdm_display_init        (GdmDisplay      *self);
+ static void     gdm_display_finalize    (GObject         *object);
+@@ -1447,6 +1450,13 @@ can_create_environment (const char *session_id)
+         char *path;
+         gboolean session_exists;
+ 
++#ifdef ENABLE_WAYLAND_SUPPORT
++        /* Disable X11 sessions if KMS is enabled in the nvidia driver
++         * See LP: #1697882.
++         */
++        if (is_nvidia_kms_available ())
++                return FALSE;
++#endif
+         path = g_strdup_printf (GNOME_SESSION_SESSIONS_PATH "/%s.session", session_id);
+         session_exists = g_file_test (path, G_FILE_TEST_EXISTS);
+ 
+diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
+index 7a4643d..50ddaea 100644
+--- a/daemon/gdm-local-display-factory.c
++++ b/daemon/gdm-local-display-factory.c
+@@ -48,6 +48,8 @@
+ 
+ #define MAX_DISPLAY_FAILURES 5
+ 
++extern int nvidia_has_kms;
++
+ struct GdmLocalDisplayFactoryPrivate
+ {
+         GdmDBusLocalDisplayFactory *skeleton;
+@@ -459,6 +461,9 @@ gdm_local_display_factory_sync_seats (GdmLocalDisplayFactory *factory)
+                         is_initial = FALSE;
+                 }
+ 
++                if (is_nvidia_kms_available ())
++                        session_type = "wayland";
++
+                 create_display (factory, seat, session_type, is_initial);
+         }
+ 
+diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
+index 0b83223..5e597c4 100644
+--- a/daemon/gdm-session.c
++++ b/daemon/gdm-session.c
+@@ -62,6 +62,8 @@
+ 
+ #define GDM_WORKER_DBUS_PATH "/org/gnome/DisplayManager/Worker"
+ 
++extern int nvidia_has_kms;
++
+ typedef struct
+ {
+         GdmSession            *session;
+@@ -354,7 +356,9 @@ get_system_session_dirs (GdmSession *self)
+ 
+         search_array = g_array_new (TRUE, TRUE, sizeof (char *));
+ 
+-        g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs));
++        if (!is_nvidia_kms_available ()) {
++                g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs));
++        }
+ 
+ #ifdef ENABLE_WAYLAND_SUPPORT
+         if (!self->priv->ignore_wayland) {
+diff --git a/libgdm/Makefile.am b/libgdm/Makefile.am
+index 99ada9a..66af6b5 100644
+--- a/libgdm/Makefile.am
++++ b/libgdm/Makefile.am
+@@ -36,6 +36,8 @@ AM_CPPFLAGS = \
+         -I$(builddir)                                                   \
+         -I$(top_srcdir)                                                 \
+         -I$(top_builddir)                                               \
++        -I$(top_srcdir)/common                                          \
++        -I$(top_builddir)/common                                        \
+         -DG_LOG_DOMAIN=\"Gdm\"                                          \
+         -DDMCONFDIR=\""$(dmconfdir)"\"                                        \
+         -DDATADIR=\""$(datadir)"\"                                            \
+@@ -64,6 +66,7 @@ libgdm_la_LDFLAGS =                                                    \
+         $(END_OF_LIST)
+ 
+ libgdm_la_LIBADD =                                                     \
++        $(top_builddir)/common/libgdmcommon.la                         \
+         $(LIBGDM_LIBS)                                                 \
+         $(SYSTEMD_LIBS)                                                \
+         $(END_OF_LIST)
+diff --git a/libgdm/gdm-sessions.c b/libgdm/gdm-sessions.c
+index a645224..419f055 100644
+--- a/libgdm/gdm-sessions.c
++++ b/libgdm/gdm-sessions.c
+@@ -37,6 +37,8 @@
+ 
+ #include "gdm-sessions.h"
+ 
++extern int nvidia_has_kms;
++
+ typedef struct _GdmSessionFile {
+         char    *id;
+         char    *path;
+@@ -208,8 +210,10 @@ collect_sessions (void)
+                                                                     g_free, g_free);
+         }
+ 
+-        for (i = 0; xorg_search_dirs [i] != NULL; i++) {
+-                collect_sessions_from_directory (xorg_search_dirs [i]);
++        if (!is_nvidia_kms_available ()) {
++                for (i = 0; xorg_search_dirs [i] != NULL; i++) {
++                        collect_sessions_from_directory (xorg_search_dirs [i]);
++                }
+         }
+ 
+ #ifdef ENABLE_WAYLAND_SUPPORT
+-- 
+2.7.4
+

=== modified file 'debian/patches/series'
--- debian/patches/series	2017-08-21 08:48:14 +0000
+++ debian/patches/series	2017-08-24 09:08:19 +0000
@@ -5,6 +5,7 @@
 92_systemd_unit.patch
 93_translate-default-desktop.patch
 94_retain_xorg_log.patch
+95_hide_x11_sessions_with_nvidia_kms.patch
 ubuntu_run_xsession.d.patch
 ubuntu_xresources_is_a_dir.patch
 ubuntu_nvidia_prime.patch

