Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp7553493imm; Thu, 28 Jun 2018 05:48:53 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcBXGauDcUA/Pg+OkKUWeQJNhdFtgg1giOI1dXW7uykPjJUSiYpdh5MDoxHyNCVW/sSVSdY X-Received: by 2002:a62:d24a:: with SMTP id c71-v6mr1914615pfg.242.1530190133043; Thu, 28 Jun 2018 05:48:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530190133; cv=none; d=google.com; s=arc-20160816; b=XjJUyW7d2fx44WgmSQSuvTrEC7Qezmqxwb9y3To3iNsx+qgpCIt6WSHEjB4WMx5hu0 ZXUX6vd3oUcsr0uFxdq726hAAra/A7FoKWdt8PNlyDPkWOPL66V+U5V+Cxos6lJzyZeq FC1jYGty4xKW7rqu9xsddhZ/xd3oPFJPAjnEXb4f6UFmrDxy2YEEJis8eUnsnrFvhllz C8gqi1pTGT7dNYj1JvqnrXDiLUQNZ7u0+MMPk5HHy4vjafrRJa1ELoxcSi+BVawc0Hm/ uF556gisoj3/O/s/qQR6XVbKMLZrDBuau+d8yZtSe3+eDxOPCbfUfQHAT7aYHzIicvEC z6xQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :organization:references:in-reply-to:date:cc:to:from:subject :message-id:arc-authentication-results; bh=6fHoooK9fnVXVYQt/bV0Z4G5wcs9Gm3/IOC7TbCClsk=; b=0AlNjH6uJmbZhon8W4qnLISuSX2eijCrV1DKWgMVaroPHfvbgVcpHtHZ6qDFDSaYrf ssmw1WprrWiDW/t3PO/jLtatt06kZquF3Eft2fU7oRNWWUZvAHWeB050gxfZqRu0814E C3niz7UmxseUTC01WCmdlWY5sl2po7KK1W+rkCJIgvuEVm4jz2OZpyPfjY/QQKD6hs26 T+UhGl7HEApJ211K38IFSssIo7AEtRIY2YODfK7hOgiuL2QZRcF+VK8hlCIjJoYu1PIZ qNxBt0CUWd6GPox8oGmZTHnZLoDDa2z/qXrJ9gO4HuQZKrvIykEm9DiyfICZ9NmpFFL7 Bkug== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o16-v6si5849244pgd.12.2018.06.28.05.48.38; Thu, 28 Jun 2018 05:48:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935403AbeF1Mb5 (ORCPT + 99 others); Thu, 28 Jun 2018 08:31:57 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:59698 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932371AbeF1Mb4 (ORCPT ); Thu, 28 Jun 2018 08:31:56 -0400 Received: from juma (unknown [IPv6:2804:14c:181:9195:9419:3bed:192:1e62]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: padovan) by bhuna.collabora.co.uk (Postfix) with ESMTPSA id C817C261420; Thu, 28 Jun 2018 13:31:51 +0100 (BST) Message-ID: <06736479f36918a58d6b4986b697ddb7569c920e.camel@collabora.com> Subject: Re: [RFC PATCH] drm/atomic: add ASYNC_UPDATE flag to the Atomic IOCTL. From: Gustavo Padovan To: Maarten Lankhorst , Enric Balletbo i Serra , David Airlie Cc: dnicoara@chromium.org, alexandros.frantzis@collabora.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, tomasz Figa , Sean Paul , kernel@collabora.com, =?ISO-8859-1?Q?St=E9phane?= Marchesin , Sean Paul Date: Thu, 28 Jun 2018 09:31:46 -0300 In-Reply-To: References: <20180627212506.24061-1-enric.balletbo@collabora.com> Organization: Collabora Ltd Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.28.3 (3.28.3-1.fc28) Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Maarten, On Thu, 2018-06-28 at 10:31 +0200, Maarten Lankhorst wrote: > Op 27-06-18 om 23:25 schreef Enric Balletbo i Serra: > > From: Gustavo Padovan > > > > This flag tells core to jump ahead the queued update if the > > conditions > > in drm_atomic_async_check() are met. That means we are only able to > > do an > > async update if no modeset is pending and update for the same plane > > is > > not queued. > > > > It uses the already in place infrastructure for async updates. > > > > It is useful for cursor updates and async PageFlips over the atomic > > ioctl, otherwise in some cases updates may be delayed to the point > > the > > user will notice it. > > > > DRM_MODE_ATOMIC_ASYNC_UPDATE should be passed to the Atomic IOCTL > > to use > > this feature. > > > > Signed-off-by: Gustavo Padovan > > Signed-off-by: Enric Balletbo i Serra > > > > --- > > Hi, > > > > This is an attempt to introduce the new ASYNC_UPDATE flag for > > atomic > > operations, see the commit message for a more detailed description. > > > > To test this patch we have created an IGT test that we plan to send > > to > > the ML but also was tested using a small program that exercises the > > uAPI > > for easy sanity testing. The program created by Alexandros can be > > found here > > [2]. To test, just build the program and use the --atomic flag to > > use the > > cursor plane in normal (blocking mode), and --atomic-async to use > > the cursor > > plane with the ASYNC_UPDATE flag.E.g. > > > > drm_cursor --atomic > > > > or > > > > drm_cursor --atomic-async > > > > The test worked on a Samsung Chromebook Plus on top of mainline > > plus > > the patch to update cursors asynchronously through atomic for the > > drm/rockchip driver [3]. > > > > Alexandros also did a proof-of-concept to use this flag and draw > > cursors > > using atomic if possible on ozone [1]. > > > > Best regards, > > Enric > > > > [1] https://chromium-review.googlesource.com/c/chromium/src/+/10927 > > 11 > > [2] https://gitlab.collabora.com/alf/drm-cursor > > [3] https://patchwork.kernel.org/patch/10492693/ > > > > > > drivers/gpu/drm/drm_atomic.c | 6 ++++++ > > drivers/gpu/drm/drm_atomic_helper.c | 9 ++++++--- > > include/uapi/drm/drm_mode.h | 4 +++- > > 3 files changed, 15 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/gpu/drm/drm_atomic.c > > b/drivers/gpu/drm/drm_atomic.c > > index c825c76edc1d..15b799f46982 100644 > > --- a/drivers/gpu/drm/drm_atomic.c > > +++ b/drivers/gpu/drm/drm_atomic.c > > @@ -80,6 +80,7 @@ drm_atomic_state_init(struct drm_device *dev, > > struct drm_atomic_state *state) > > * setting this appropriately? > > */ > > state->allow_modeset = true; > > + state->async_update = true; > > Do we really want this by default? > > Wouldn't it make more sense to only enable it if userspace requests > it? This value is rewritten when we check for the ASYNC_UPDATE flag, so it disable by default. I guess this line could be removed then. > > > > state->crtcs = kcalloc(dev->mode_config.num_crtc, > > sizeof(*state->crtcs), GFP_KERNEL); > > @@ -2320,6 +2321,10 @@ int drm_mode_atomic_ioctl(struct drm_device > > *dev, > > (arg->flags & DRM_MODE_PAGE_FLIP_EVENT)) > > return -EINVAL; > > > > + if ((arg->flags & DRM_MODE_ATOMIC_ALLOW_MODESET) && > > + (arg->flags & > > DRM_MODE_ATOMIC_ASYNC_UPDATE)) > > + return -EINVAL; > > + > > drm_modeset_acquire_init(&ctx, > > DRM_MODESET_ACQUIRE_INTERRUPTIBLE); > > > > state = drm_atomic_state_alloc(dev); > > We should probably move it to be a flag only enabled when requested, > and reject with the error returned by drm_atomic_helper_async_check() > when things fail. > > ~Maarten > > @@ -2328,6 +2333,7 @@ int drm_mode_atomic_ioctl(struct drm_device > > *dev, > > > > state->acquire_ctx = &ctx; > > state->allow_modeset = !!(arg->flags & > > DRM_MODE_ATOMIC_ALLOW_MODESET); > > + state->async_update = !!(arg->flags & > > DRM_MODE_ATOMIC_ASYNC_UPDATE); > > > > retry: > > plane_mask = 0; > > diff --git a/drivers/gpu/drm/drm_atomic_helper.c > > b/drivers/gpu/drm/drm_atomic_helper.c > > index c35654591c12..aeb0523d3bcf 100644 > > --- a/drivers/gpu/drm/drm_atomic_helper.c > > +++ b/drivers/gpu/drm/drm_atomic_helper.c > > @@ -891,7 +891,7 @@ int drm_atomic_helper_check(struct drm_device > > *dev, > > if (ret) > > return ret; > > > > - if (state->legacy_cursor_update) > > + if (state->async_update || state->legacy_cursor_update) > > state->async_update = > > !drm_atomic_helper_async_check(dev, state); > > > > return ret; > > @@ -1526,13 +1526,16 @@ int drm_atomic_helper_async_check(struct > > drm_device *dev, > > if (new_plane_state->fence) > > return -EINVAL; > > > > + /* Only do an async update if there is a pending commit. > > */ > > + if (!old_plane_state->commit) > > + return -EINVAL; > > + > > /* > > * Don't do an async update if there is an outstanding > > commit modifying > > * the plane. This prevents our async update's changes > > from getting > > * overridden by a previous synchronous update's state. > > */ > > - if (old_plane_state->commit && > > - !try_wait_for_completion(&old_plane_state->commit- > > >hw_done)) > > + if (!try_wait_for_completion(&old_plane_state->commit- > > >hw_done)) > > return -EBUSY; > > > > return funcs->atomic_async_check(plane, new_plane_state); > > diff --git a/include/uapi/drm/drm_mode.h > > b/include/uapi/drm/drm_mode.h > > index 50bcf4214ff9..772e84f0edeb 100644 > > --- a/include/uapi/drm/drm_mode.h > > +++ b/include/uapi/drm/drm_mode.h > > @@ -718,13 +718,15 @@ struct drm_mode_destroy_dumb { > > #define DRM_MODE_ATOMIC_TEST_ONLY 0x0100 > > #define DRM_MODE_ATOMIC_NONBLOCK 0x0200 > > #define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400 > > +#define DRM_MODE_ATOMIC_ASYNC_UPDATE 0x0800 > > > > #define DRM_MODE_ATOMIC_FLAGS (\ > > DRM_MODE_PAGE_FLIP_EVENT |\ > > DRM_MODE_PAGE_FLIP_ASYNC |\ > > DRM_MODE_ATOMIC_TEST_ONLY |\ > > DRM_MODE_ATOMIC_NONBLOCK |\ > > - DRM_MODE_ATOMIC_ALLOW_MODESET) > > + DRM_MODE_ATOMIC_ALLOW_MODESET |\ > > + DRM_MODE_ATOMIC_ASYNC_UPDATE) > > > > struct drm_mode_atomic { > > __u32 flags; > > -- Gustavo Padovan Collabora Ltd.