From patchwork Fri Oct 23 09:24:59 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pingbo Wen X-Patchwork-Id: 55472 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wi0-f197.google.com (mail-wi0-f197.google.com [209.85.212.197]) by patches.linaro.org (Postfix) with ESMTPS id 81D8520581 for ; Fri, 23 Oct 2015 09:25:23 +0000 (UTC) Received: by wikv3 with SMTP id v3sf8282903wik.1 for ; Fri, 23 Oct 2015 02:25:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=FVRlvHFEQKRlUBMoTaUIOztDljn4E1H2N1TSKFxAWxw=; b=dkNTxa94KQIx/Y1OWM0VZGnPfAcGe7vooKDwC3NLrc3Sq/whnIEL036YX4CojvUpBf 38z14yqb4NbGl5fb/7xQoeBCVOKKYCT7hnXRpoGrB0fJ2SPAwgAZWOoKF1F7dWRymLG0 YSqsP4Nj1prD6J6phgdtqWGOJJHAHPg28L1W+GMTCB86qAMDeK8fMIoPO6CnKBfK7kWq QhakXbuZ42RExtZeB61DFcYT0u+gSEQ6Z59ohK2TJnhQIwcNEbbLQn9nvPAAQR0V8+fq gXUN21Vwe4vahBOcEvO8Hx1XNVQuMHeBxtkxNZLj7kFZg4C04bMvamz0941TN4oAEGVI TK2Q== X-Gm-Message-State: ALoCoQmniFcm3pbUCTZ1dH9NyoeFRYI+scgOSGC6A2RyEj3ATYQgRIKZNvLzOa6VQQbPnYUCEovd X-Received: by 10.180.216.105 with SMTP id op9mr644806wic.0.1445592322790; Fri, 23 Oct 2015 02:25:22 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.25.86.9 with SMTP id k9ls108853lfb.43.gmail; Fri, 23 Oct 2015 02:25:22 -0700 (PDT) X-Received: by 10.25.167.138 with SMTP id q132mr6954310lfe.15.1445592322638; Fri, 23 Oct 2015 02:25:22 -0700 (PDT) Received: from mail-lf0-f42.google.com (mail-lf0-f42.google.com. [209.85.215.42]) by mx.google.com with ESMTPS id 33si12159817lfu.47.2015.10.23.02.25.22 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 23 Oct 2015 02:25:22 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.42 as permitted sender) client-ip=209.85.215.42; Received: by lffv3 with SMTP id v3so76674472lff.0 for ; Fri, 23 Oct 2015 02:25:22 -0700 (PDT) X-Received: by 10.112.161.168 with SMTP id xt8mr10522271lbb.88.1445592321711; Fri, 23 Oct 2015 02:25:21 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.59.35 with SMTP id w3csp1096809lbq; Fri, 23 Oct 2015 02:25:20 -0700 (PDT) X-Received: by 10.66.199.40 with SMTP id jh8mr3635883pac.123.1445592320582; Fri, 23 Oct 2015 02:25:20 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id gx4si28139514pbc.234.2015.10.23.02.25.20 for ; Fri, 23 Oct 2015 02:25:20 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-input-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751287AbbJWJZS (ORCPT ); Fri, 23 Oct 2015 05:25:18 -0400 Received: from mail-pa0-f42.google.com ([209.85.220.42]:35901 "EHLO mail-pa0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751079AbbJWJZR (ORCPT ); Fri, 23 Oct 2015 05:25:17 -0400 Received: by pacfv9 with SMTP id fv9so118973440pac.3 for ; Fri, 23 Oct 2015 02:25:16 -0700 (PDT) X-Received: by 10.68.182.34 with SMTP id eb2mr3903341pbc.87.1445592316728; Fri, 23 Oct 2015 02:25:16 -0700 (PDT) Received: from localhost.localdomain (edge04.meizu.com. [103.26.122.10]) by smtp.gmail.com with ESMTPSA id vl1sm17962784pbc.31.2015.10.23.02.25.14 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 23 Oct 2015 02:25:16 -0700 (PDT) From: WEN Pingbo To: arnd@arndb.de Cc: y2038@lists.linaro.org, dmitry.torokhov@gmail.com, linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, WEN Pingbo Subject: [PATCH V2] hil_mlc: convert timeval to ktime_t Date: Fri, 23 Oct 2015 17:24:59 +0800 Message-Id: <1445592300-30894-1-git-send-email-pingbo.wen@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <46052377.96MapaKFAy@wuerfel> References: <46052377.96MapaKFAy@wuerfel> Sender: linux-input-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: pingbo.wen@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.42 as permitted sender) smtp.mailfrom=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Using struct timeval will cause time overflow in 2038, replacing it with ktime_t. And we don't need to handle sec and nsec separately. Since mlc->lcv_t is only interested in seconds, directly using time64_t here. And monotonic time is better here, since the original driver don't care the wall time. In addition, the original driver try to covert usec to jiffies manually in hilse_donode(). This is not a universal and safe way, using nsecs_to_jiffies() to fix that. Signed-off-by: WEN Pingbo --- drivers/input/serio/hil_mlc.c | 28 +++++++++++++--------------- drivers/input/serio/hp_sdc_mlc.c | 8 ++++---- include/linux/hil_mlc.h | 4 ++-- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/drivers/input/serio/hil_mlc.c b/drivers/input/serio/hil_mlc.c index 65605e4..2746509 100644 --- a/drivers/input/serio/hil_mlc.c +++ b/drivers/input/serio/hil_mlc.c @@ -274,14 +274,12 @@ static int hilse_match(hil_mlc *mlc, int unused) /* An LCV used to prevent runaway loops, forces 5 second sleep when reset. */ static int hilse_init_lcv(hil_mlc *mlc, int unused) { - struct timeval tv; + time64_t now = ktime_get_seconds(); - do_gettimeofday(&tv); - - if (mlc->lcv && (tv.tv_sec - mlc->lcv_tv.tv_sec) < 5) + if (mlc->lcv && (now - mlc->lcv_t) < 5) return -1; - mlc->lcv_tv = tv; + mlc->lcv_t = now; mlc->lcv = 0; return 0; @@ -605,7 +603,7 @@ static inline void hilse_setup_input(hil_mlc *mlc, const struct hilse_node *node } mlc->istarted = 1; mlc->intimeout = node->arg; - do_gettimeofday(&(mlc->instart)); + mlc->instart = ktime_get(); mlc->icount = 15; memset(mlc->ipacket, 0, 16 * sizeof(hil_packet)); BUG_ON(down_trylock(&mlc->isem)); @@ -710,7 +708,7 @@ static int hilse_donode(hil_mlc *mlc) break; } mlc->ostarted = 0; - do_gettimeofday(&(mlc->instart)); + mlc->instart = ktime_get(); write_unlock_irqrestore(&mlc->lock, flags); nextidx = HILSEN_NEXT; break; @@ -731,18 +729,18 @@ static int hilse_donode(hil_mlc *mlc) #endif while (nextidx & HILSEN_SCHED) { - struct timeval tv; + ktime_t tmp = ktime_sub(ktime_get(), mlc->instart); if (!sched_long) goto sched; - do_gettimeofday(&tv); - tv.tv_usec += USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec); - tv.tv_usec -= mlc->instart.tv_usec; - if (tv.tv_usec >= mlc->intimeout) goto sched; - tv.tv_usec = (mlc->intimeout - tv.tv_usec) * HZ / USEC_PER_SEC; - if (!tv.tv_usec) goto sched; - mod_timer(&hil_mlcs_kicker, jiffies + tv.tv_usec); + if (tmp.tv64 >= (mlc->intimeout * NSEC_PER_USEC)) + goto sched; + tmp.tv64 = mlc->intimeout * NSEC_PER_USEC - tmp.tv64; + if (tmp.tv64 < NSEC_PER_USEC) + goto sched; + mod_timer(&hil_mlcs_kicker, + jiffies + nsecs_to_jiffies(tmp.tv64)); break; sched: tasklet_schedule(&hil_mlcs_tasklet); diff --git a/drivers/input/serio/hp_sdc_mlc.c b/drivers/input/serio/hp_sdc_mlc.c index d50f067..0a27b89 100644 --- a/drivers/input/serio/hp_sdc_mlc.c +++ b/drivers/input/serio/hp_sdc_mlc.c @@ -149,7 +149,8 @@ static int hp_sdc_mlc_in(hil_mlc *mlc, suseconds_t timeout) /* Try to down the semaphore */ if (down_trylock(&mlc->isem)) { - struct timeval tv; + ktime_t tmp = ktime_sub(ktime_get(), mlc->instart); + if (priv->emtestmode) { mlc->ipacket[0] = HIL_ERR_INT | (mlc->opacket & @@ -160,9 +161,8 @@ static int hp_sdc_mlc_in(hil_mlc *mlc, suseconds_t timeout) /* printk(KERN_DEBUG PREFIX ">[%x]\n", mlc->ipacket[0]); */ goto wasup; } - do_gettimeofday(&tv); - tv.tv_usec += USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec); - if (tv.tv_usec - mlc->instart.tv_usec > mlc->intimeout) { + + if (tmp.tv64 > mlc->intimeout * NSEC_PER_USEC) { /* printk("!%i %i", tv.tv_usec - mlc->instart.tv_usec, mlc->intimeout); diff --git a/include/linux/hil_mlc.h b/include/linux/hil_mlc.h index 394a840..2222ec6 100644 --- a/include/linux/hil_mlc.h +++ b/include/linux/hil_mlc.h @@ -144,12 +144,12 @@ struct hil_mlc { hil_packet ipacket[16]; hil_packet imatch; int icount; - struct timeval instart; + ktime_t instart; suseconds_t intimeout; int ddi; /* Last operational device id */ int lcv; /* LCV to throttle loops */ - struct timeval lcv_tv; /* Time loop was started */ + time64_t lcv_t; /* Time loop was started */ int di_map[7]; /* Maps below items to live devs */ struct hil_mlc_devinfo di[HIL_MLC_DEVMEM];