Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp1011982yba; Thu, 4 Apr 2019 02:23:46 -0700 (PDT) X-Google-Smtp-Source: APXvYqx9HiePvyX8mHegzAk3UNDmxJ7h2VuUR+K4RYjS8+5X4A6rPOyyu5H97hu5XOI9bEh2Xkh2 X-Received: by 2002:a62:1701:: with SMTP id 1mr4817582pfx.120.1554369826209; Thu, 04 Apr 2019 02:23:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554369826; cv=none; d=google.com; s=arc-20160816; b=vps64dsb9DSOBcIc0sXyLhlW24tISU+X5XFm0F3s0ofzF7BZbdIvJSek6O2Yi9LDnk m+EwvJBkKzDJgVTQ9z2yuVZ8kAg+B9N0VrSXuykwfvwT3Ow3A8sMsxvg25CCVcW8DpIg l+h/6FmAGGJRajLQmy0ToHhdtQXSRe7T8X8eYrCV282YCSpHgd+R8QaD3JkDnwNTG6BO 8vKH5gvPLVTu5qi7myPqq51mGKT+J6xU/qDiff19uLiIYkhRyXY0mv6vXJ8hEw5rROqe niSXLzYEU8mKLsytHQkrdjK5mKwshHPxhwCI2uBmcDxVlYpUE6WS8XlGcGGgyb5kajeu II9w== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=FpQq1imuBrWXShmQvSDi+skwF0/M41ZN0on0SX7TSJ8=; b=xU4S0/A2QHd0ZQvHa/I64qikw0Hsbahw6pgGGOkt6+Xe1+PoqMu+/DPVroHbolsgHR cMi3xch+UsgAZDKdamRC1JWDB0F6XBhyim0lLw8OWGoOvZfcSHY6FayjK0JgbSkCHZlA 41PTMXHbD4qaC/GmQzCu84mWqZTKI6UmSNlvUg+aRiQorOLMEx7tFZOev4t9dfoJz5Ht ZqAV65UD1Ha6PR51e7M2KhvcvuB6FqKgMzDGuGz4Ak+bS+4kWGtcVsKwSF6p2XiUAJKZ MpYeCm6aRg6eUaAP7aMa1fWP2f0joLQWyz885D0IazbX97j8NLfPRIUs0wwZzTap7KgH IYQg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=K8Crgzql; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e7si14914583pfc.152.2019.04.04.02.23.30; Thu, 04 Apr 2019 02:23:46 -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; dkim=pass header.i=@kernel.org header.s=default header.b=K8Crgzql; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388127AbfDDJWs (ORCPT + 99 others); Thu, 4 Apr 2019 05:22:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:56938 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387538AbfDDJPs (ORCPT ); Thu, 4 Apr 2019 05:15:48 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 07F7021734; Thu, 4 Apr 2019 09:15:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554369347; bh=TVpYoRwqP//PnvcsWAv6NGtEpoLgzlXMyHD28shlvn0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K8Crgzql0TlZJr6DPwKkymu8nHKBB4svSUABRuU8NzJO0bYnoTf0tL7iAXWhEml6R jA01SWLXq+9utp33kUNZSJE3KH8DXlE+nlG6je5z0SnwzlJDJAyAYaP3dsvebbc6c4 lqVzRovY5MYOk5T2gcqlcJTje8VGHeCn26jlbT9w= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Shayenne Moura , Daniel Vetter , Rodrigo Siqueira , Sasha Levin Subject: [PATCH 5.0 177/246] drm/vkms: Bugfix racing hrtimer vblank handle Date: Thu, 4 Apr 2019 10:47:57 +0200 Message-Id: <20190404084625.376610155@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190404084619.236418459@linuxfoundation.org> References: <20190404084619.236418459@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 5.0-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit ba420afab565bdc7b028ddd4f222260f2de7a1db ] 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 Reviewed-by: Rodrigo Siqueira Signed-off-by: Rodrigo Siqueira Link: https://patchwork.freedesktop.org/patch/msgid/e2e4b8f3a5cab7b2dba75bf1930f86b0a4ee08c9.1548856186.git.shayenneluzmoura@gmail.com Signed-off-by: Sasha Levin --- 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 e747a7d16739..00d961862d77 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -4,13 +4,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"); @@ -31,19 +35,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.19.1