Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp247767ybi; Wed, 29 May 2019 20:35:46 -0700 (PDT) X-Google-Smtp-Source: APXvYqwnefGZLd5iKfRhNq85jOLAdE1LRRTEoiAGnnmJYo79wZ7RnXm1D6G+joEPgc0S1DVYbYQ6 X-Received: by 2002:a17:90a:cb10:: with SMTP id z16mr1386599pjt.81.1559187346353; Wed, 29 May 2019 20:35:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559187346; cv=none; d=google.com; s=arc-20160816; b=hUiOCDpEauUo4nljDVPlcBB0Vl9z/9lHrqhfzlwwK22gwEpRr62gyEU8eu90q3Stp1 TjrHxX5YQMtW5lk/Opw+RL6d78bvEdU2edNGLnDO3//6CSQUyCuu7Ch+4Q6J8VNZnkJ3 YRLW7nZ+58rXm+EhIkjp0go1mL4bhUb0VRnbCc8G6NK2am/BY/gbgD+9c9ayNSfstrek K/+qVkO81c/qID4B1yNMX2c7fe5asHpZZBDQTCjcEQaMir1jCr2rZ2BZV3aH/jalgLs5 0S3atQInV7wTOllBR5NsopfbuzfDQlHtxhNhMpa9AU/K04+72oalhuqS4kiS26Q9Ld1B odag== 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=lC09xeUKqnHi0jJk2pUlQNS2kqvjQ/CIQii560JY320=; b=gyDsFJ+9dq1btgnkvtEMCnpZ6eW/0tZAnFdtWVfvL/YAKQ1nN8rsEUGVsQ5pb4w/4t R5VPbSdzh2m+DYLYpDGupdKZS61PbfccxkMhkGXcCei7J1J2TVwHXaOT0MxBSj6yOaAK NR2/63sf2jq12/btKzqNTWSVeCczoojynP1GOQazLfmgz1YN7fC3IgnsPCOu3K70eCFL adhB6n8jl/Puv7Re9ycPt7dlzJViSjGdmyEL4DRGrhu0uxR04vTEoZBbmsmYoXnSNRfz 3nsmTz5a0GmmN+I+jdv936vO5tdYhUByf2P2rS4mqGZK24UFn5vUNCev9/zIkyuvbOFX Cicg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=DSS4CeOr; 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 a13si1574750pjs.78.2019.05.29.20.35.29; Wed, 29 May 2019 20:35: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=DSS4CeOr; 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 S2387956AbfE3D1T (ORCPT + 99 others); Wed, 29 May 2019 23:27:19 -0400 Received: from mail.kernel.org ([198.145.29.99]:54748 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731872AbfE3DTW (ORCPT ); Wed, 29 May 2019 23:19:22 -0400 Received: from localhost (ip67-88-213-2.z213-88-67.customer.algx.net [67.88.213.2]) (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 13E6C24818; Thu, 30 May 2019 03:19:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1559186362; bh=AKYKhN37l1ofoSY5p/TrruqFDqSsGXnhr/5Ei12xz9M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DSS4CeOr5Si5NlW+lf2F6bQ7N+2P0NDiHIDFfAB+hSuam0aWx9yPfhbQ9lJjqgQdw VChOnpohTNiWs0uqyutwxbh5AZ0W1eln7h7jcgxb+4WGs2U8FiNjwN53epBqFniZNn Sp02kGtdVGrN2+vh4AplMH1QRIO9pnNWULyJlxgE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Catalin Marinas , Vincenzo Frascino , Will Deacon , Sasha Levin Subject: [PATCH 4.14 109/193] arm64: vdso: Fix clock_getres() for CLOCK_REALTIME Date: Wed, 29 May 2019 20:06:03 -0700 Message-Id: <20190530030503.987263643@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190530030446.953835040@linuxfoundation.org> References: <20190530030446.953835040@linuxfoundation.org> User-Agent: quilt/0.66 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 [ Upstream commit 81fb8736dd81da3fe94f28968dac60f392ec6746 ] clock_getres() in the vDSO library has to preserve the same behaviour of posix_get_hrtimer_res(). In particular, posix_get_hrtimer_res() does: sec = 0; ns = hrtimer_resolution; where 'hrtimer_resolution' depends on whether or not high resolution timers are enabled, which is a runtime decision. The vDSO incorrectly returns the constant CLOCK_REALTIME_RES. Fix this by exposing 'hrtimer_resolution' in the vDSO datapage and returning that instead. Reviewed-by: Catalin Marinas Signed-off-by: Vincenzo Frascino [will: Use WRITE_ONCE(), move adr off COARSE path, renumber labels, use 'w' reg] Signed-off-by: Will Deacon Signed-off-by: Sasha Levin --- arch/arm64/include/asm/vdso_datapage.h | 1 + arch/arm64/kernel/asm-offsets.c | 2 +- arch/arm64/kernel/vdso.c | 3 +++ arch/arm64/kernel/vdso/gettimeofday.S | 7 +++---- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/arch/arm64/include/asm/vdso_datapage.h b/arch/arm64/include/asm/vdso_datapage.h index 2b9a63771eda8..f89263c8e11af 100644 --- a/arch/arm64/include/asm/vdso_datapage.h +++ b/arch/arm64/include/asm/vdso_datapage.h @@ -38,6 +38,7 @@ struct vdso_data { __u32 tz_minuteswest; /* Whacky timezone stuff */ __u32 tz_dsttime; __u32 use_syscall; + __u32 hrtimer_res; }; #endif /* !__ASSEMBLY__ */ diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c index b5e43b01b396c..b4a0f4ab770ab 100644 --- a/arch/arm64/kernel/asm-offsets.c +++ b/arch/arm64/kernel/asm-offsets.c @@ -95,7 +95,7 @@ int main(void) DEFINE(CLOCK_REALTIME, CLOCK_REALTIME); DEFINE(CLOCK_MONOTONIC, CLOCK_MONOTONIC); DEFINE(CLOCK_MONOTONIC_RAW, CLOCK_MONOTONIC_RAW); - DEFINE(CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC); + DEFINE(CLOCK_REALTIME_RES, offsetof(struct vdso_data, hrtimer_res)); DEFINE(CLOCK_REALTIME_COARSE, CLOCK_REALTIME_COARSE); DEFINE(CLOCK_MONOTONIC_COARSE,CLOCK_MONOTONIC_COARSE); DEFINE(CLOCK_COARSE_RES, LOW_RES_NSEC); diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index 2d419006ad433..ec0bb588d7553 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -232,6 +232,9 @@ void update_vsyscall(struct timekeeper *tk) vdso_data->wtm_clock_sec = tk->wall_to_monotonic.tv_sec; vdso_data->wtm_clock_nsec = tk->wall_to_monotonic.tv_nsec; + /* Read without the seqlock held by clock_getres() */ + WRITE_ONCE(vdso_data->hrtimer_res, hrtimer_resolution); + if (!use_syscall) { /* tkr_mono.cycle_last == tkr_raw.cycle_last */ vdso_data->cs_cycle_last = tk->tkr_mono.cycle_last; diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index 76320e9209651..df829c4346fac 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S @@ -301,13 +301,14 @@ ENTRY(__kernel_clock_getres) ccmp w0, #CLOCK_MONOTONIC_RAW, #0x4, ne b.ne 1f - ldr x2, 5f + adr vdso_data, _vdso_data + ldr w2, [vdso_data, #CLOCK_REALTIME_RES] b 2f 1: cmp w0, #CLOCK_REALTIME_COARSE ccmp w0, #CLOCK_MONOTONIC_COARSE, #0x4, ne b.ne 4f - ldr x2, 6f + ldr x2, 5f 2: cbz w1, 3f stp xzr, x2, [x1] @@ -321,8 +322,6 @@ ENTRY(__kernel_clock_getres) svc #0 ret 5: - .quad CLOCK_REALTIME_RES -6: .quad CLOCK_COARSE_RES .cfi_endproc ENDPROC(__kernel_clock_getres) -- 2.20.1