Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6060574imu; Wed, 30 Jan 2019 08:09:08 -0800 (PST) X-Google-Smtp-Source: ALg8bN7vnY72VPvxNrBcavsyoJlz2uvQvrYH/vOkuZE0VfIH8VKZMdZ1gcjkA3UyRn8uMP45MYzA X-Received: by 2002:a17:902:b83:: with SMTP id 3mr29488541plr.42.1548864548321; Wed, 30 Jan 2019 08:09:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1548864548; cv=none; d=google.com; s=arc-20160816; b=pUEE74exL7/JLTRoi6J+NMgFbE1s1MRJvICYx6GEh6su5iNmO0u7rrU4se/oYwtT/u wSC+9O5VptqRiYRUoRpKwOQo6Uro78qG1pspuKLBsY/ekiyuYOS8Y9sL/XVXu0XBKMTG fNuvuh1dPLcXvgqgZVkdK39C2lXcNxvRU9eAeHDoxYOioNkq0TP9daamMTZ23y26VzUh 0O7OH8/qewk6GFxby7674zJ6bwt/ScQ6qA/DIN7DPqhUoi+pzEAFCcWaykwk4KFh+QcF rwsaPWlgeWEfc7x3A1r5uYlIGWa2M1fUokedrAE9pc/dUKrqBkjAOQLL1BmmIjx0zTyT wUXA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=tEC/1d7HwlRgQF4JsIh02lHiS2ctUBvLOXuE7PW9NQU=; b=Ek5uzTlfpXEh3JhvmB/ByRLxzkdYesSQ18Iyjq2tTERgobwWuw7QNuRcfcN/mw2sLP Ij6qLDbxrIRO1Qg0CViJgz3KxW3Nhz10alQAp8cv30P9E9/uY93eXLVc0RNZT9kqGu0o JMDM6ouM85GKoyKKvJXxNNdWCbyTCZNk3fWIaM45T6yWmi9/Xthv2SpT7oxiTV9m48ZC RMExNvAhx9883tYnMA+zkxOCApmSMGEheVb/rn4Vzs2AHmdQDAJ65wMZUEsqdhzOgptJ jk66X3PVYeySXnEi8gHhEPteA8Mhl7r62fGvxepOO7LjSbK6G8fLv+t7SNgny8zbW0/O ffEQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=tX5lc8qQ; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u123si1665887pgb.516.2019.01.30.08.08.46; Wed, 30 Jan 2019 08:09:08 -0800 (PST) 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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=tX5lc8qQ; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731837AbfA3QHS (ORCPT + 99 others); Wed, 30 Jan 2019 11:07:18 -0500 Received: from mail-qt1-f194.google.com ([209.85.160.194]:33594 "EHLO mail-qt1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728726AbfA3QHR (ORCPT ); Wed, 30 Jan 2019 11:07:17 -0500 Received: by mail-qt1-f194.google.com with SMTP id l11so102418qtp.0 for ; Wed, 30 Jan 2019 08:07:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=tEC/1d7HwlRgQF4JsIh02lHiS2ctUBvLOXuE7PW9NQU=; b=tX5lc8qQqbp5g+iqJQ4JUu2U0Lmtx89xg3dB9WyPxbZsrDUS3OG2NVS86u++i+nijC 7+7XiF+PUXR8O9Jvqti9eyQHDhPkcyXMxPUVejvZ+dSTo6RQ26eWItDJfvkUTJ/TcwSk ycDj5VbTaCuSf77ZCqWqVnH4DHbOdbjd5FXQzCCO4a5KtvBfGNz6cdb9t7Yxp8Iu5+Xa nMFXUJPFLZ9XS28UhonNZwjFg74TwtQaMlPfcQcjw9dAFJgBgG5WD7nAe7CbBMG0pqmC bfhr0NsAnqe7f0Q/+EmuLY5ccLWKBS9sRi4aU9Y8E7vjbqwxWyKcNv2dI/1qc1snHgJN 2Uxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=tEC/1d7HwlRgQF4JsIh02lHiS2ctUBvLOXuE7PW9NQU=; b=aGgH/0dpJf5BlmtqYb8qfrLEbooRzithOT0MtN/Wm10cBraekXcO6aW7CaGEfI8+Ii zhMw8D6gMwZJ7zhjpngNgtId0PMFKNIDnni/spJaqWIB1i6ba1ZHHbk6GXAJTBT7UV8C rA8863bxHPUcFeUBzvWGu1E2lS4z43kIOiPXnwQM3QLxnPzngyApEzNifkNHX/Ww2OHi jwlh5MyoxnZrxVyX5dj1Y29s5/2NdayWAMQHgA2UUrc8VWID2pPuuKMcAbDZRG7ff9BI O1Ts8xDqqhTUc/w6oX2tJwH6ivHVAn31OaOjAXjOB+eRz+PT6mySLiH5kfZwds3eSQnj PD0w== X-Gm-Message-State: AJcUukdanNf0yb3cZisBSPca0eOaPtgFubULe31fO5jkdFuzhOUBLPuN Thw8yDLC3+ZooXXwTewhmuc= X-Received: by 2002:a0c:81c4:: with SMTP id 4mr30036967qve.156.1548864436074; Wed, 30 Jan 2019 08:07:16 -0800 (PST) Received: from smtp.gmail.com ([143.107.45.1]) by smtp.gmail.com with ESMTPSA id d85sm1790571qkb.89.2019.01.30.08.07.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 30 Jan 2019 08:07:15 -0800 (PST) Date: Wed, 30 Jan 2019 14:07:11 -0200 From: Shayenne Moura To: Rodrigo Siqueira , Haneen Mohammed , Daniel Vetter , David Airlie Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/2] drm: vkms: Bugfix racing hrtimer vblank handle Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20171215 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When the vblank irq happens, kernel time subsystem executes `vkms_vblank_simulate`. In parallel or not, it prepares all stuff necessary to the next vblank with arm, and it must flush these stuff before the next vblank irq. However, vblank counter is ahead when arm is executed in parallel with handle vblank. CPU 0: CPU 1: | | atomic_commit_tail is ongoing | | | | hrtimer: vkms_vblank_simulate() | | | drm_crtc_handle_vblank() | | drm_crtc_arm_vblank() | | | ->get_vblank_timestamp() | | | | hrtimer_forward_now() Then, we should guarantee that the vblank interval time is correct (not changed) before finish the vblank handle. Fix the bug including the call to `hrtimer_forward_now()` in the same lock of `drm_crtc_handle_vblank()` to ensure that the timestamp update is correct when finish the vblank handle. Signed-off-by: Shayenne Moura Signed-off-by: Daniel Vetter --- drivers/gpu/drm/vkms/vkms_crtc.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c index 23146ff2a25b..5a095610726b 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -10,13 +10,17 @@ #include #include -static void _vblank_handle(struct vkms_output *output) +static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) { + struct vkms_output *output = container_of(timer, struct vkms_output, + vblank_hrtimer); struct drm_crtc *crtc = &output->crtc; struct vkms_crtc_state *state = to_vkms_crtc_state(crtc->state); + int ret_overrun; bool ret; spin_lock(&output->lock); + ret = drm_crtc_handle_vblank(crtc); if (!ret) DRM_ERROR("vkms failure on handling vblank"); @@ -37,19 +41,9 @@ static void _vblank_handle(struct vkms_output *output) DRM_WARN("failed to queue vkms_crc_work_handle"); } - spin_unlock(&output->lock); -} - -static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) -{ - struct vkms_output *output = container_of(timer, struct vkms_output, - vblank_hrtimer); - int ret_overrun; - - _vblank_handle(output); - ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer, output->period_ns); + spin_unlock(&output->lock); return HRTIMER_RESTART; } -- 2.17.1