From patchwork Mon Jun 18 15:05:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Salyzyn X-Patchwork-Id: 10472071 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 864E36032A for ; Mon, 18 Jun 2018 15:23:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 75BC326E3C for ; Mon, 18 Jun 2018 15:23:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6A500284E4; Mon, 18 Jun 2018 15:23:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 8B10926E3C for ; Mon, 18 Jun 2018 15:23:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=hHN88f6v4XM0rgsEOTvOENa7J5MoKO3j/T5DOkQWGgA=; b=EL0fqS+CGiXiYFC+j1wnC/lsI6 ttNYZ3dx4HigAcSzpOzudBkZx84CdRamF78q+/k+yozWd3Ob3ybztYCEATI3MrxYwTcwToil3wcW+ d7qE8KkruqqwzHzXQE3Mx/Mr6iwzLR+M08jRpHE3VRFNHHzGN/dykZXgHBX+rDDC9Kfpfa7faCZTI kCaBZAoRWoFLe+2vnXRQnBycuqsISGCkWB1jT14FdgWewVoTxnH9E+S5aS3/h5OI/0FKLHCzd8GmT 3tJWa3TOWEv2KQYZFafPx4f3no93czS7B+aaDYZ1tFjtHVaqbkEk7lAyX9Nb7s1D+QOkHnt0cLNez QnioZi6w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1fUw04-000427-2j; Mon, 18 Jun 2018 15:23:24 +0000 Received: from casper.infradead.org ([85.118.1.10]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fUvsu-00074k-N2 for linux-arm-kernel@bombadil.infradead.org; Mon, 18 Jun 2018 15:16:00 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=X86V6YtcWK7TLibFpBM7miBVBdHmWKvWf82ZwTHYTys=; b=G5iY7MqWaO7n6VgjF5xof1hLa vFMsTUCK7EV3WqleCmT6/3urNMwie1zeiIj5fEQLspWl4niP063SuC3BQDbNXRU/q1G4IQhmQvql8 M258bYhWyiAxce6Hx5ABPgE3hE0LcdVpfK18oRysZjTQvXrWbCXodkc4vc9KEL6jSEeQonigsXqBr UTxBXaUKNkqzHD0frUsCXy86O8Tez/g+uuNfDtynfvemktlRcGWvq7cckEFTgysW4Egh1Xw5m41p8 zYzJQgCs+UgEKHUkDApD1JurZ7bJ/ZfNcY1dssT45NBg1XC18RS6HLgAd4em4VhQrS+aRcHljsDgC V1LBVOTKA==; Received: from mail-pf0-x243.google.com ([2607:f8b0:400e:c00::243]) by casper.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1fUvkA-0005uH-2J for linux-arm-kernel@lists.infradead.org; Mon, 18 Jun 2018 15:07:03 +0000 Received: by mail-pf0-x243.google.com with SMTP id y5-v6so8318350pfn.4 for ; Mon, 18 Jun 2018 08:06:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=android.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=X86V6YtcWK7TLibFpBM7miBVBdHmWKvWf82ZwTHYTys=; b=bHU7KjhpM+qM7/7dIUWRaiF3oyiKT8AcdZWSjrO59WMsJdcpc5PNQdXSzI/2XjgeLk NDv7EZjC9GB9hZj5hAy0qjKV0lHiEToFVjbnUZlBRIh+g08cFOwOWy9Aau/IQIspl/vn B1YBIbpGV8GUwjChSNAIb2VpAx1RnZ4jWPGfyyf9sr7/gGpv0FGZiF4jj29RCpBoCTdV fYZq9h/KiW/mkUuanceiu8MPlSgREBqGJYAWcqNe4Q9qMvEHvwmIqofzOQZIwa+xa18G ZeTJ+s+mvkxZRVNjFZjw7/LQCVI1efCzxpJdnHU4fBmKCfa7FdN9yqoW9WrvWEmlZ0Aj E+iA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=X86V6YtcWK7TLibFpBM7miBVBdHmWKvWf82ZwTHYTys=; b=D8cHHlajy7vAoMa4FOZHRtSW001zl6KOogXi62+iKsVkYue1mbvE4nwVfgaRrHsw3O SFHnCLyAj3pR8gUlBd6sDDCn9yrwnExdp/FzKtaHUZnMcd9+wA36cx/GVi4QEyI+dIbX bKs4c2LcLbw6U3FDZ3uKWpRX0i69r761IbMizbZffn318tbHEDlOIUkYy26X8gVw6XkL 4y0P6T+BoQpKDFW7cDT5CSU/BmPF7G08hR5EE5jwJI/6ZBB3vc75Wzk+SvN1fTsusi9a kxeDAS7Df7xymgdq8TFvfwgbOdVRDXrXRK9TED6frjp66HN+7mReL7i6bm98iv5iwtAv uAZg== X-Gm-Message-State: APt69E16dMzIA/xQsbAIxDMmqBBbUe4nyxk68NRMhWiJGheL3DLPDYUG 2AGWxJu7w7JeRSnSRSFx0+P88A== X-Google-Smtp-Source: ADUXVKIGkXDh61hsMcOdNdOaAXFukZC0woLNuyNcARSXgMuwE+ZqFHSIB7FhE/+x135RuJ/ZkBFu7Q== X-Received: by 2002:a65:5686:: with SMTP id v6-v6mr11447398pgs.141.1529334405807; Mon, 18 Jun 2018 08:06:45 -0700 (PDT) Received: from nebulus.mtv.corp.google.com ([2620:0:1000:1611:6077:8eec:bc7e:d0f4]) by smtp.gmail.com with ESMTPSA id i7-v6sm54830660pfa.34.2018.06.18.08.06.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Jun 2018 08:06:45 -0700 (PDT) From: Mark Salyzyn To: linux-kernel@vger.kernel.org Subject: RESEND [PATCH v5 02/12] arm: vdso: add include file defining __get_datapage() Date: Mon, 18 Jun 2018 08:05:48 -0700 Message-Id: <20180618150613.10322-3-salyzyn@android.com> X-Mailer: git-send-email 2.18.0.rc1.244.gcf134e6275-goog In-Reply-To: <20180618150613.10322-1-salyzyn@android.com> References: <20180618150613.10322-1-salyzyn@android.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180618_160658_104414_37CFABB2 X-CRM114-Status: GOOD ( 31.77 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , Kate Stewart , Catalin Marinas , Will Deacon , Mark Salyzyn , Ingo Molnar , Russell King , Andy Gross , Laura Abbott , Dave Martin , "Eric W. Biederman" , Kees Cook , Kevin Brodsky , John Stultz , Thomas Gleixner , linux-arm-kernel@lists.infradead.org, "Paul E. McKenney" , Ard Biesheuvel , Greg Kroah-Hartman , Jeremy Linton , Andy Lutomirski , James Morse , Andrew Pinski , Dmitry Safonov MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Take an effort to recode the arm64 vdso code from assembler to C previously submitted by Andrew Pinski , rework it for use in both arm and arm64, overlapping any optimizations for each architecture. But instead of landing it in arm64, land the result into lib/vdso and unify both implementations to simplify future maintenance. Define the prototype for __get_datapage() in local datapage.h header. Rename all vdata variable that point to the datapage shortened to vd to relect a consistent and concise style. Make sure that all references to the datapage in vdso operations are readonly (const). Make sure datapage is first parameter to all subroutines to also be consistent. Signed-off-by: Mark Salyzyn Cc: James Morse Cc: Russell King Cc: Catalin Marinas Cc: Will Deacon Cc: Andy Lutomirski Cc: Dmitry Safonov Cc: John Stultz Cc: Mark Rutland Cc: Laura Abbott Cc: Kees Cook Cc: Ard Biesheuvel Cc: Andy Gross Cc: Kevin Brodsky Cc: Andrew Pinski Cc: Thomas Gleixner Cc: linux-kernel@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: Jeremy Linton v2: - split first CL into 2 of 7 pieces v4: - update commit message to reflect overall reasoning v5: - rebase --- arch/arm/vdso/datapage.h | 25 +++++++++ arch/arm/vdso/vgettimeofday.c | 99 +++++++++++++++++------------------ 2 files changed, 73 insertions(+), 51 deletions(-) create mode 100644 arch/arm/vdso/datapage.h diff --git a/arch/arm/vdso/datapage.h b/arch/arm/vdso/datapage.h new file mode 100644 index 000000000000..e3088bdfb946 --- /dev/null +++ b/arch/arm/vdso/datapage.h @@ -0,0 +1,25 @@ +/* + * Userspace implementations of __get_datapage + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __VDSO_DATAPAGE_H +#define __VDSO_DATAPAGE_H + +#include +#include + +extern const struct vdso_data *__get_datapage(void); + +#endif /* __VDSO_DATAPAGE_H */ diff --git a/arch/arm/vdso/vgettimeofday.c b/arch/arm/vdso/vgettimeofday.c index 8cf13af1323c..2474c17dc356 100644 --- a/arch/arm/vdso/vgettimeofday.c +++ b/arch/arm/vdso/vgettimeofday.c @@ -30,20 +30,19 @@ #include #include #include -#include #ifndef CONFIG_AEABI #error This code depends on AEABI system call conventions #endif -extern struct vdso_data *__get_datapage(void); +#include "datapage.h" -static notrace u32 vdso_read_begin(const struct vdso_data *vdata) +static notrace u32 vdso_read_begin(const struct vdso_data *vd) { u32 seq; do { - seq = READ_ONCE(vdata->tb_seq_count); + seq = READ_ONCE(vd->tb_seq_count); if ((seq & 1) == 0) break; @@ -55,12 +54,12 @@ static notrace u32 vdso_read_begin(const struct vdso_data *vdata) return seq; } -static notrace int vdso_read_retry(const struct vdso_data *vdata, u32 start) +static notrace int vdso_read_retry(const struct vdso_data *vd, u32 start) { u32 seq; smp_rmb(); /* Pairs with first smp_wmb in update_vsyscall */ - seq = READ_ONCE(vdata->tb_seq_count); + seq = READ_ONCE(vd->tb_seq_count); return seq != start; } @@ -81,38 +80,38 @@ static notrace long clock_gettime_fallback(clockid_t _clkid, return ret; } -static notrace int do_realtime_coarse(struct timespec *ts, - struct vdso_data *vdata) +static notrace int do_realtime_coarse(const struct vdso_data *vd, + struct timespec *ts) { u32 seq; do { - seq = vdso_read_begin(vdata); + seq = vdso_read_begin(vd); - ts->tv_sec = vdata->xtime_coarse_sec; - ts->tv_nsec = vdata->xtime_coarse_nsec; + ts->tv_sec = vd->xtime_coarse_sec; + ts->tv_nsec = vd->xtime_coarse_nsec; - } while (vdso_read_retry(vdata, seq)); + } while (vdso_read_retry(vd, seq)); return 0; } -static notrace int do_monotonic_coarse(struct timespec *ts, - struct vdso_data *vdata) +static notrace int do_monotonic_coarse(const struct vdso_data *vd, + struct timespec *ts) { struct timespec tomono; u32 seq; do { - seq = vdso_read_begin(vdata); + seq = vdso_read_begin(vd); - ts->tv_sec = vdata->xtime_coarse_sec; - ts->tv_nsec = vdata->xtime_coarse_nsec; + ts->tv_sec = vd->xtime_coarse_sec; + ts->tv_nsec = vd->xtime_coarse_nsec; - tomono.tv_sec = vdata->wtm_clock_sec; - tomono.tv_nsec = vdata->wtm_clock_nsec; + tomono.tv_sec = vd->wtm_clock_sec; + tomono.tv_nsec = vd->wtm_clock_nsec; - } while (vdso_read_retry(vdata, seq)); + } while (vdso_read_retry(vd, seq)); ts->tv_sec += tomono.tv_sec; timespec_add_ns(ts, tomono.tv_nsec); @@ -122,7 +121,7 @@ static notrace int do_monotonic_coarse(struct timespec *ts, #ifdef CONFIG_ARM_ARCH_TIMER -static notrace u64 get_ns(struct vdso_data *vdata) +static notrace u64 get_ns(const struct vdso_data *vd) { u64 cycle_delta; u64 cycle_now; @@ -130,29 +129,29 @@ static notrace u64 get_ns(struct vdso_data *vdata) cycle_now = arch_counter_get_cntvct(); - cycle_delta = (cycle_now - vdata->cs_cycle_last) & vdata->cs_mask; + cycle_delta = (cycle_now - vd->cs_cycle_last) & vd->cs_mask; - nsec = (cycle_delta * vdata->cs_mono_mult) + vdata->xtime_clock_snsec; - nsec >>= vdata->cs_shift; + nsec = (cycle_delta * vd->cs_mono_mult) + vd->xtime_clock_snsec; + nsec >>= vd->cs_shift; return nsec; } -static notrace int do_realtime(struct timespec *ts, struct vdso_data *vdata) +static notrace int do_realtime(const struct vdso_data *vd, struct timespec *ts) { u64 nsecs; u32 seq; do { - seq = vdso_read_begin(vdata); + seq = vdso_read_begin(vd); - if (vdata->use_syscall) + if (vd->use_syscall) return -1; - ts->tv_sec = vdata->xtime_clock_sec; - nsecs = get_ns(vdata); + ts->tv_sec = vd->xtime_clock_sec; + nsecs = get_ns(vd); - } while (vdso_read_retry(vdata, seq)); + } while (vdso_read_retry(vd, seq)); ts->tv_nsec = 0; timespec_add_ns(ts, nsecs); @@ -160,25 +159,25 @@ static notrace int do_realtime(struct timespec *ts, struct vdso_data *vdata) return 0; } -static notrace int do_monotonic(struct timespec *ts, struct vdso_data *vdata) +static notrace int do_monotonic(const struct vdso_data *vd, struct timespec *ts) { struct timespec tomono; u64 nsecs; u32 seq; do { - seq = vdso_read_begin(vdata); + seq = vdso_read_begin(vd); - if (vdata->use_syscall) + if (vd->use_syscall) return -1; - ts->tv_sec = vdata->xtime_clock_sec; - nsecs = get_ns(vdata); + ts->tv_sec = vd->xtime_clock_sec; + nsecs = get_ns(vd); - tomono.tv_sec = vdata->wtm_clock_sec; - tomono.tv_nsec = vdata->wtm_clock_nsec; + tomono.tv_sec = vd->wtm_clock_sec; + tomono.tv_nsec = vd->wtm_clock_nsec; - } while (vdso_read_retry(vdata, seq)); + } while (vdso_read_retry(vd, seq)); ts->tv_sec += tomono.tv_sec; ts->tv_nsec = 0; @@ -189,12 +188,12 @@ static notrace int do_monotonic(struct timespec *ts, struct vdso_data *vdata) #else /* CONFIG_ARM_ARCH_TIMER */ -static notrace int do_realtime(struct timespec *ts, struct vdso_data *vdata) +static notrace int do_realtime(const struct vdso_data *vd, struct timespec *ts) { return -1; } -static notrace int do_monotonic(struct timespec *ts, struct vdso_data *vdata) +static notrace int do_monotonic(const struct vdso_data *vd, struct timespec *ts) { return -1; } @@ -203,23 +202,22 @@ static notrace int do_monotonic(struct timespec *ts, struct vdso_data *vdata) notrace int __vdso_clock_gettime(clockid_t clkid, struct timespec *ts) { - struct vdso_data *vdata; int ret = -1; - vdata = __get_datapage(); + const struct vdso_data *vd = __get_datapage(); switch (clkid) { case CLOCK_REALTIME_COARSE: - ret = do_realtime_coarse(ts, vdata); + ret = do_realtime_coarse(vd, ts); break; case CLOCK_MONOTONIC_COARSE: - ret = do_monotonic_coarse(ts, vdata); + ret = do_monotonic_coarse(vd, ts); break; case CLOCK_REALTIME: - ret = do_realtime(ts, vdata); + ret = do_realtime(vd, ts); break; case CLOCK_MONOTONIC: - ret = do_monotonic(ts, vdata); + ret = do_monotonic(vd, ts); break; default: break; @@ -251,12 +249,11 @@ static notrace long gettimeofday_fallback(struct timeval *_tv, notrace int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) { struct timespec ts; - struct vdso_data *vdata; int ret; - vdata = __get_datapage(); + const struct vdso_data *vd = __get_datapage(); - ret = do_realtime(&ts, vdata); + ret = do_realtime(vd, &ts); if (ret) return gettimeofday_fallback(tv, tz); @@ -265,8 +262,8 @@ notrace int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz) tv->tv_usec = ts.tv_nsec / 1000; } if (tz) { - tz->tz_minuteswest = vdata->tz_minuteswest; - tz->tz_dsttime = vdata->tz_dsttime; + tz->tz_minuteswest = vd->tz_minuteswest; + tz->tz_dsttime = vd->tz_dsttime; } return ret;