[Mesa-dev] [PATCH mesa] wayland: Disable prime support on buggy kernels
Kristian Høgsberg
krh at bitplanet.net
Mon Apr 29 09:15:59 PDT 2013
On Tue, Apr 23, 2013 at 9:54 AM, Ander Conselvan de Oliveira
<ander.conselvan.de.oliveira at intel.com> wrote:
> Linux kernel 3.8 shipped with a bug in the prime fd passing code that
> makes it unreliable. As of this writing, it seems unlikely that 3.9
> will contain the fix for the issue.
>
> This patch disable prime support when running on top of those kernels,
> in order to prevent unexpected behavior when running a Wayland
> compositor.
>
> Commit be8a42ae60addd8b6092535c11b42d099d6470ec in Linus tree introduces
> the problem, which can be fixed by the patch below (not upstream yet):
> http://lists.freedesktop.org/archives/dri-devel/2013-April/037716.html
What about the idea of using the self-ref test at init time to
determine if the kernel is buggy or not instead of the hard-coded
version check?
Kristian
> ---
> src/egl/drivers/dri2/egl_dri2.c | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
> index 06a21d7..13b9107 100644
> --- a/src/egl/drivers/dri2/egl_dri2.c
> +++ b/src/egl/drivers/dri2/egl_dri2.c
> @@ -38,6 +38,7 @@
> #include <GL/internal/dri_interface.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> +#include <sys/utsname.h>
>
> #include "egl_dri2.h"
>
> @@ -1557,6 +1558,38 @@ static struct wayland_drm_callbacks wl_drm_callbacks = {
> };
>
> static EGLBoolean
> +kernel_prime_support_not_buggy()
> +{
> + struct utsname un;
> +
> + /* Linux kernel 3.8 shipped with a bug in the prime fd passing code that
> + * makes it unreliable. As of this writing, it seems unlikely that 3.9
> + * will contain the fix for the issue. Disable prime support when running
> + * on top of those kernels, in order to prevent unexpected behavior when
> + * running a Wayland compositor.
> + *
> + * Commit be8a42ae60addd8b6092535c11b42d099d6470ec in Linus tree introduces
> + * the problem, which can be fixed by the patch below (not upstream yet):
> + * http://lists.freedesktop.org/archives/dri-devel/2013-April/037716.html
> + */
> + if (uname(&un) == -1) {
> + _eglLog(_EGL_INFO,
> + "DRI2: wayland prime support disabled: unknown kernel version");
> + return EGL_FALSE;
> + }
> +
> + if (strncmp(un.sysname, "Linux", strlen("Linux")) == 0 &&
> + (strncmp(un.release, "3.8.", strlen("3.8.")) == 0 ||
> + strncmp(un.release, "3.9.", strlen("3.9.")) == 0)) {
> + _eglLog(_EGL_INFO,
> + "DRI2: wayland prime support disabled: buggy kernel");
> + return EGL_FALSE;
> + }
> +
> + return EGL_TRUE;
> +}
> +
> +static EGLBoolean
> dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
> struct wl_display *wl_dpy)
> {
> @@ -1575,7 +1608,8 @@ dri2_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
> ret = drmGetCap(dri2_dpy->fd, DRM_CAP_PRIME, &cap);
> if (ret == 0 && cap == (DRM_PRIME_CAP_IMPORT | DRM_PRIME_CAP_EXPORT) &&
> dri2_dpy->image->base.version >= 7 &&
> - dri2_dpy->image->createImageFromFds != NULL)
> + dri2_dpy->image->createImageFromFds != NULL &&
> + kernel_prime_support_not_buggy())
> flags |= WAYLAND_DRM_PRIME;
>
> dri2_dpy->wl_server_drm =
> --
> 1.7.10.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list