From: Rob Clark <robdclark@gmail.com> To: dri-devel@lists.freedesktop.org Cc: Peter Zijlstra <peterz@infradead.org>, Tejun Heo <tj@kernel.org>, timmurray@google.com, linux-arm-msm@vger.kernel.org, Rob Clark <robdclark@chromium.org>, Maarten Lankhorst <maarten.lankhorst@linux.intel.com>, Maxime Ripard <mripard@kernel.org>, Thomas Zimmermann <tzimmermann@suse.de>, David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>, linux-kernel@vger.kernel.org (open list) Subject: [PATCH 3/3] drm: Add a client-cap to set scheduling mode Date: Sat, 19 Sep 2020 12:37:26 -0700 [thread overview] Message-ID: <20200919193727.2093945-4-robdclark@gmail.com> (raw) In-Reply-To: <20200919193727.2093945-1-robdclark@gmail.com> From: Rob Clark <robdclark@chromium.org> Add DRM_CLIENT_CAP_SCHED_MODE so that userspace can control the scheduling mode for nonblocking atomic commits. Userspace such as android, which treats the display pipeline as realtime (SCHED_FIFO) should set DRM_CLIENT_CAP_SCHED_FIFO to prevent userspace components of the display pipeline (like surfaceflinger) from preempting atomic commit_work. This cap may only be set by the drm master, after setting the DRM_CLIENT_CAP_ATOMIC cap. The scheduling mode is returned to default (SCHED_NORMAL) after master is dropped. Signed-off-by: Rob Clark <robdclark@chromium.org> --- drivers/gpu/drm/drm_auth.c | 4 ++++ drivers/gpu/drm/drm_crtc.c | 26 ++++++++++++++++++++++++++ drivers/gpu/drm/drm_ioctl.c | 13 +++++++++++++ include/drm/drm_crtc.h | 2 ++ include/uapi/drm/drm.h | 13 +++++++++++++ 5 files changed, 58 insertions(+) diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c index f2d46b7ac6f9..217f422389f9 100644 --- a/drivers/gpu/drm/drm_auth.c +++ b/drivers/gpu/drm/drm_auth.c @@ -31,6 +31,7 @@ #include <linux/slab.h> #include <drm/drm_auth.h> +#include <drm/drm_crtc.h> #include <drm/drm_drv.h> #include <drm/drm_file.h> #include <drm/drm_lease.h> @@ -335,6 +336,9 @@ void drm_master_release(struct drm_file *file_priv) drm_lease_revoke(master); } + if (drm_core_check_feature(dev, DRIVER_ATOMIC) && file_priv->is_master) + drm_crtc_set_sched_mode(dev, DRM_CLIENT_CAP_SCHED_NORMAL); + /* drop the master reference held by the file priv */ if (file_priv->master) drm_master_put(&file_priv->master); diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 4f7c0bfce0a3..02f2be0b1700 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -93,6 +93,32 @@ struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx) } EXPORT_SYMBOL(drm_crtc_from_index); +/** + * drm_crtc_set_sched_mode: + * @dev: DRM device + * @mode: one of DRM_CLIENT_CAP_SCHED_x + * + * Set the scheduling mode for per-CRTC kthread workers. This controls + * whether nonblocking atomic commits will run with SCHED_NORMAL or + * SCHED_FIFO (rt) priority. + */ +void drm_crtc_set_sched_mode(struct drm_device *dev, int mode) +{ + struct drm_crtc *crtc; + + drm_for_each_crtc(crtc, dev) { + switch (mode) { + case DRM_CLIENT_CAP_SCHED_NORMAL: + /* zero is default nice value for kthreads: */ + sched_set_normal(crtc->worker->task, 0); + break; + case DRM_CLIENT_CAP_SCHED_FIFO: + sched_set_fifo(crtc->worker->task); + break; + } + } +} + int drm_crtc_force_disable(struct drm_crtc *crtc) { struct drm_mode_set set = { diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 789ee65ac1f5..44920621571c 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -362,6 +362,19 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv) return -EINVAL; file_priv->writeback_connectors = req->value; break; + case DRM_CLIENT_CAP_SCHED_MODE: + if (!file_priv->is_master) + return -EPERM; + if (!file_priv->atomic) + return -EOPNOTSUPP; + switch (req->value) { + case DRM_CLIENT_CAP_SCHED_NORMAL: + case DRM_CLIENT_CAP_SCHED_FIFO: + drm_crtc_set_sched_mode(dev, req->value); + return 0; + default: + return -EINVAL; + } default: return -EINVAL; } diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 8964a3732bca..6dd4d01b7191 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1245,6 +1245,8 @@ static inline uint32_t drm_crtc_mask(const struct drm_crtc *crtc) int drm_mode_set_config_internal(struct drm_mode_set *set); struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx); +void drm_crtc_set_sched_mode(struct drm_device *dev, int mode); + /** * drm_crtc_find - look up a CRTC object from its ID * @dev: DRM device diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index 808b48a93330..989e007ef608 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h @@ -698,6 +698,19 @@ struct drm_get_cap { */ #define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5 +/** + * DRM_CLIENT_CAP_SCHED_MODE + * + * Allow userspace to control the scheduling parameters for nonblocking + * commit. The default is SCHED_NORMAL/CFS. Userspace using SCHED_FIFO + * in the rendering/display pipeline should use DRM_CLIENT_CAP_SCHED_FIFO + * to prevent userspace portions of the display pipeline from preempting + * nonblocking commit_work. + */ +#define DRM_CLIENT_CAP_SCHED_MODE 6 +# define DRM_CLIENT_CAP_SCHED_NORMAL 0 +# define DRM_CLIENT_CAP_SCHED_FIFO 1 + /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ struct drm_set_client_cap { __u64 capability; -- 2.26.2
WARNING: multiple messages have this Message-ID (diff)
From: Rob Clark <robdclark@gmail.com> To: dri-devel@lists.freedesktop.org Cc: Rob Clark <robdclark@chromium.org>, Peter Zijlstra <peterz@infradead.org>, linux-arm-msm@vger.kernel.org, open list <linux-kernel@vger.kernel.org>, timmurray@google.com, David Airlie <airlied@linux.ie>, Thomas Zimmermann <tzimmermann@suse.de>, Tejun Heo <tj@kernel.org> Subject: [PATCH 3/3] drm: Add a client-cap to set scheduling mode Date: Sat, 19 Sep 2020 12:37:26 -0700 [thread overview] Message-ID: <20200919193727.2093945-4-robdclark@gmail.com> (raw) In-Reply-To: <20200919193727.2093945-1-robdclark@gmail.com> From: Rob Clark <robdclark@chromium.org> Add DRM_CLIENT_CAP_SCHED_MODE so that userspace can control the scheduling mode for nonblocking atomic commits. Userspace such as android, which treats the display pipeline as realtime (SCHED_FIFO) should set DRM_CLIENT_CAP_SCHED_FIFO to prevent userspace components of the display pipeline (like surfaceflinger) from preempting atomic commit_work. This cap may only be set by the drm master, after setting the DRM_CLIENT_CAP_ATOMIC cap. The scheduling mode is returned to default (SCHED_NORMAL) after master is dropped. Signed-off-by: Rob Clark <robdclark@chromium.org> --- drivers/gpu/drm/drm_auth.c | 4 ++++ drivers/gpu/drm/drm_crtc.c | 26 ++++++++++++++++++++++++++ drivers/gpu/drm/drm_ioctl.c | 13 +++++++++++++ include/drm/drm_crtc.h | 2 ++ include/uapi/drm/drm.h | 13 +++++++++++++ 5 files changed, 58 insertions(+) diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c index f2d46b7ac6f9..217f422389f9 100644 --- a/drivers/gpu/drm/drm_auth.c +++ b/drivers/gpu/drm/drm_auth.c @@ -31,6 +31,7 @@ #include <linux/slab.h> #include <drm/drm_auth.h> +#include <drm/drm_crtc.h> #include <drm/drm_drv.h> #include <drm/drm_file.h> #include <drm/drm_lease.h> @@ -335,6 +336,9 @@ void drm_master_release(struct drm_file *file_priv) drm_lease_revoke(master); } + if (drm_core_check_feature(dev, DRIVER_ATOMIC) && file_priv->is_master) + drm_crtc_set_sched_mode(dev, DRM_CLIENT_CAP_SCHED_NORMAL); + /* drop the master reference held by the file priv */ if (file_priv->master) drm_master_put(&file_priv->master); diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 4f7c0bfce0a3..02f2be0b1700 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -93,6 +93,32 @@ struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx) } EXPORT_SYMBOL(drm_crtc_from_index); +/** + * drm_crtc_set_sched_mode: + * @dev: DRM device + * @mode: one of DRM_CLIENT_CAP_SCHED_x + * + * Set the scheduling mode for per-CRTC kthread workers. This controls + * whether nonblocking atomic commits will run with SCHED_NORMAL or + * SCHED_FIFO (rt) priority. + */ +void drm_crtc_set_sched_mode(struct drm_device *dev, int mode) +{ + struct drm_crtc *crtc; + + drm_for_each_crtc(crtc, dev) { + switch (mode) { + case DRM_CLIENT_CAP_SCHED_NORMAL: + /* zero is default nice value for kthreads: */ + sched_set_normal(crtc->worker->task, 0); + break; + case DRM_CLIENT_CAP_SCHED_FIFO: + sched_set_fifo(crtc->worker->task); + break; + } + } +} + int drm_crtc_force_disable(struct drm_crtc *crtc) { struct drm_mode_set set = { diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 789ee65ac1f5..44920621571c 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -362,6 +362,19 @@ drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv) return -EINVAL; file_priv->writeback_connectors = req->value; break; + case DRM_CLIENT_CAP_SCHED_MODE: + if (!file_priv->is_master) + return -EPERM; + if (!file_priv->atomic) + return -EOPNOTSUPP; + switch (req->value) { + case DRM_CLIENT_CAP_SCHED_NORMAL: + case DRM_CLIENT_CAP_SCHED_FIFO: + drm_crtc_set_sched_mode(dev, req->value); + return 0; + default: + return -EINVAL; + } default: return -EINVAL; } diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 8964a3732bca..6dd4d01b7191 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -1245,6 +1245,8 @@ static inline uint32_t drm_crtc_mask(const struct drm_crtc *crtc) int drm_mode_set_config_internal(struct drm_mode_set *set); struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx); +void drm_crtc_set_sched_mode(struct drm_device *dev, int mode); + /** * drm_crtc_find - look up a CRTC object from its ID * @dev: DRM device diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index 808b48a93330..989e007ef608 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h @@ -698,6 +698,19 @@ struct drm_get_cap { */ #define DRM_CLIENT_CAP_WRITEBACK_CONNECTORS 5 +/** + * DRM_CLIENT_CAP_SCHED_MODE + * + * Allow userspace to control the scheduling parameters for nonblocking + * commit. The default is SCHED_NORMAL/CFS. Userspace using SCHED_FIFO + * in the rendering/display pipeline should use DRM_CLIENT_CAP_SCHED_FIFO + * to prevent userspace portions of the display pipeline from preempting + * nonblocking commit_work. + */ +#define DRM_CLIENT_CAP_SCHED_MODE 6 +# define DRM_CLIENT_CAP_SCHED_NORMAL 0 +# define DRM_CLIENT_CAP_SCHED_FIFO 1 + /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ struct drm_set_client_cap { __u64 capability; -- 2.26.2 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2020-09-19 19:36 UTC|newest] Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-09-19 19:37 [PATCH 0/3] drm: commit_work scheduling Rob Clark 2020-09-19 19:37 ` Rob Clark 2020-09-19 19:37 ` [PATCH 1/3] drm/crtc: Introduce per-crtc kworker Rob Clark 2020-09-19 19:37 ` Rob Clark 2020-09-21 9:20 ` Jani Nikula 2020-09-21 9:20 ` Jani Nikula 2020-09-19 19:37 ` [PATCH 2/3] drm/atomic: Use kthread worker for nonblocking commits Rob Clark 2020-09-19 19:37 ` Rob Clark 2020-09-20 1:58 ` Hillf Danton 2020-09-21 9:23 ` Daniel Vetter 2020-09-21 9:23 ` Daniel Vetter 2020-09-21 14:55 ` Rob Clark 2020-09-21 14:55 ` Rob Clark 2020-09-22 13:18 ` Daniel Vetter 2020-09-22 13:18 ` Daniel Vetter 2020-09-19 19:37 ` Rob Clark [this message] 2020-09-19 19:37 ` [PATCH 3/3] drm: Add a client-cap to set scheduling mode Rob Clark 2020-09-20 2:17 ` Hillf Danton 2020-09-21 9:21 ` [PATCH 0/3] drm: commit_work scheduling Daniel Vetter 2020-09-21 9:21 ` Daniel Vetter 2020-09-21 10:49 ` peterz 2020-09-21 10:49 ` peterz 2020-09-21 14:28 ` Tejun Heo 2020-09-21 14:28 ` Tejun Heo 2020-09-21 15:16 ` Rob Clark 2020-09-21 15:16 ` Rob Clark 2020-09-21 15:20 ` Rob Clark 2020-09-21 15:20 ` Rob Clark 2020-09-21 16:19 ` Rob Clark 2020-09-21 16:19 ` Rob Clark 2020-09-22 6:58 ` Daniel Vetter 2020-09-22 6:58 ` Daniel Vetter 2020-09-22 14:48 ` Rob Clark 2020-09-22 14:48 ` Rob Clark 2020-09-23 15:25 ` Daniel Vetter 2020-09-23 15:25 ` Daniel Vetter 2020-09-24 2:33 ` Rob Clark 2020-09-24 2:33 ` Rob Clark 2020-09-24 8:49 ` Daniel Vetter 2020-09-24 8:49 ` Daniel Vetter 2020-09-24 15:24 ` Rob Clark 2020-09-24 15:24 ` Rob Clark 2020-09-24 16:15 ` Qais Yousef 2020-09-24 16:15 ` Qais Yousef 2020-09-25 8:23 ` Daniel Vetter 2020-09-25 8:23 ` Daniel Vetter 2020-09-21 16:10 ` Qais Yousef 2020-09-21 16:10 ` Qais Yousef 2020-09-21 16:23 ` Rob Clark 2020-09-21 16:23 ` Rob Clark
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200919193727.2093945-4-robdclark@gmail.com \ --to=robdclark@gmail.com \ --cc=airlied@linux.ie \ --cc=daniel@ffwll.ch \ --cc=dri-devel@lists.freedesktop.org \ --cc=linux-arm-msm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=maarten.lankhorst@linux.intel.com \ --cc=mripard@kernel.org \ --cc=peterz@infradead.org \ --cc=robdclark@chromium.org \ --cc=timmurray@google.com \ --cc=tj@kernel.org \ --cc=tzimmermann@suse.de \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.