From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alison Schofield Subject: [PATCH v2] scsi: gdth: replace struct timeval with ktime_get_real_seconds() Date: Tue, 24 Nov 2015 16:44:07 -0800 Message-ID: <1448412247-2716-1-git-send-email-amsfield22@gmail.com> References: <20151119214304.GA16713@d830.WORKGROUP> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20151119214304.GA16713@d830.WORKGROUP> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: y2038-bounces@lists.linaro.org Sender: "Y2038" To: achim_leubner@adaptec.com, JBottomley@odin.com, linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, y2038@lists.linaro.org List-Id: linux-scsi@vger.kernel.org c3RydWN0IHRpbWV2YWwgd2lsbCBvdmVyZmxvdyBvbiAzMi1iaXQgc3lzdGVtcyBpbiB5MjAzOCBh bmQgaXMgYmVpbmcKcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwuIFJlcGxhY2UgdGhlIHVzZSBvZiBz dHJ1Y3QgdGltZXZhbCBhbmQKZG9fZ2V0dGltZW9mZGF5KCkgd2l0aCBrdGltZV9nZXRfcmVhbF9z ZWNvbmRzKCkgd2hpY2ggcHJvdmlkZXMgYSA2NC1iaXQKc2Vjb25kcyB2YWx1ZSBhbmQgaXMgeTIw Mzggc2FmZS4KCmdkdGggZHJpdmVyIHJlcXVpcmVzIGNoYW5nZXMgaW4gdHdvIGFyZWFzOgoKMSkg Z2R0aF9zdG9yZV9ldmVudCgpIGxvYWRzIHR3byB1MzIgdGltZXN0YW1wIGZpZWxkcyBmb3IgaW9j dGwgR0RUSU9DVExfRVZFTlQKCiAgIFRoZXNlIHRpbWVzdGFtcCBmaWVsZHMgYXJlIHBhcnQgb2Yg c3RydWN0IGdkdGhfZXZ0X3N0ciB1c2VkIGZvciBwYXNzaW5nCiAgIGV2ZW50IGRhdGEgdG8gdXNl cnNwYWNlLiBBdCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW4gZXZlbnQgd2UgZG8KICAgKGZpcnN0 X3N0YW1wPWxhc3Rfc3RhbXA9ImN1cnJlbnQgdGltZSIpLiBJZiB0aGF0IHNhbWUgZXZlbnQgcmVw ZWF0cywKICAgd2UgZG8gKGxhc3Rfc3RhbXA9ImN1cnJlbnQgdGltZSIpIEFORCBpbmNyZW1lbnQg c2FtZV9jb3VudCB0byBpbmRpY2F0ZQogICBob3cgbWFueSB0aW1lcyB0aGUgZXZlbnQgaGFzIHJl cGVhdGVkIHNpbmNlIGZpcnN0X3N0YW1wLgoKICAgVGhpcyBwYXRjaCByZXBsYWNlcyB0aGUgdXNl IG9mIHRpbWV2YWwgYW5kIGRvX2dldHRpbWVvZmRheSgpIHdpdGgKICAga3RpbWVfZ2V0X3JlYWxf c2Vjb25kcygpIGNhc3QgdG8gdTMyIHRvIGV4dGVuZCB0aGUgdGltZXN0YW1wIGZpZWxkcwogICB0 byB5MjEwNi4KCiAgIEJleW9uZCB5MjEwNiwgdGhlIHVzZXJzcGFjZSB0b29scyAoaWUuIFJBSUQg Y29udHJvbGxlciBtb25pdG9ycykgY2FuCiAgIHdvcmsgYXJvdW5kIHRoZSB0aW1lIHJvbGxvdmVy IGFuZCB0aGlzIGRyaXZlciB3b3VsZCBzdGlsbCBub3QgbmVlZCB0bwogICBjaGFuZ2UuCgogICBB bHRlcm5hdGl2ZTogVGhlIGFsdGVybmF0aXZlIGFwcHJvYWNoIGlzIHRvIGludHJvZHVjZSBhIG5l dyBpb2N0bCBpbiBnZHRoCiAgIHdpdGggdGhlIHUzMiB0aW1lIGZpZWxkcyBkZWZpbmVkIGFzIHU2 NC4gIFRoaXMgd291bGQgcmVxdWlyZSB1c2Vyc3BhY2UKICAgY2hhbmdlcyBub3csIGJ1dCBub3Qg aW4geTIxMDYuCgoyKSAgZ2R0aF9zaG93X2luZm8oKSBjYWxjdWxhdGVzIGVsYXBzZWQgdGltZSB1 c2luZyB1MzIgZmlyc3Rfc3RhbXAKCiAgICBJdCBpcyBhZGRpbmcgZXZlbnRzIHdpdGggdGltZXN0 YW1wcyB0byBhIHNlcV9maWxlLiAgVGltZXN0YW1wcyBhcmUKICAgIGNhbGN1bGF0ZWQgYXMgdGhl ICJjdXJyZW50IHRpbWUiIG1pbnVzIHRoZSBmaXJzdF9zdGFtcC4KCiAgICBUaGlzIHBhdGNoIHJl cGxhY2VzIHRoZSB1c2Ugb2YgdGltZXZhbCBhbmQgZG9fZ2V0dGltZW9mZGF5KCkgd2l0aAogICAg a3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpIGNhc3QgdG8gdTMyIHRvIGNhbGN1bGF0ZSB0aGUgdGlt ZXN0YW1wLgoKICAgIFRoaXMgZWxhcHNlZCB0aW1lIGNhbGN1bGF0aW9uIGlzIHNhZmUgZXZlbiB3 aGVuIHRoZSB0aW1lIHdyYXBzIChiZXlvbmQKICAgIHkyMTA2KSBkdWUgdG8gaG93IHVuc2lnbmVk IHN1YnRyYWN0aW9uIHdvcmtzLiBBIGNvbW1lbnQgaGFzIGJlZW4gYWRkZWQKICAgIHRvIHRoZSBj b2RlIHRvIGluZGljYXRlIHRoaXMgc2FmZXR5LgoKICAgIEFsdGVybmF0aXZlOiBUaGlzIHBpZWNl IGl0c2VsZiBkb2Vzbid0IHdhcnJhbnQgYW4gYWx0ZXJuYXRpdmUsIGJ1dAogICAgaWYgd2UgZG8g aW50cm9kdWNlIGEgbmV3IHN0cnVjdHVyZSAmIGlvY3RsIHdpdGggdTY0IHRpbWVzdGFtcHMsIHRo aXMKICAgIHdvdWxkIGNoYW5nZSBhY2NvcmRpbmdseS4KClNpZ25lZC1vZmYtYnk6IEFsaXNvbiBT Y2hvZmllbGQgPGFtc2ZpZWxkMjJAZ21haWwuY29tPgotLS0KQ2hhbmdlcyBpbiB2MjoKLSByZW1v dmUgdW5uZWNlc3Nhcnkga3RpbWUuaCBpbmNsdWRlcwotIGFkZCBjb21tZW50IGluIGNvZGUgdG8g ZXhwbGFpbiBlbGFwc2VkIHRpbWUgY2FsY3VsYXRpb24KLSBhZGQgZGV0YWlsIGFuZCBhbHRlcm5h dGl2ZXMgdG8gY2hhbmdlbG9nCgoKIGRyaXZlcnMvc2NzaS9nZHRoLmMgICAgICB8ICA3ICsrLS0t LS0KIGRyaXZlcnMvc2NzaS9nZHRoX3Byb2MuYyB8IDExICsrKysrKysrLS0tCiAyIGZpbGVzIGNo YW5nZWQsIDEwIGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9zY3NpL2dkdGguYyBiL2RyaXZlcnMvc2NzaS9nZHRoLmMKaW5kZXggNzFlMTM4MC4uMGE3 Njc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2dkdGguYworKysgYi9kcml2ZXJzL3Njc2kv Z2R0aC5jCkBAIC0yODM4LDcgKzI4MzgsNiBAQCBzdGF0aWMgZ2R0aF9ldnRfc3RyICpnZHRoX3N0 b3JlX2V2ZW50KGdkdGhfaGFfc3RyICpoYSwgdTE2IHNvdXJjZSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdTE2IGlkeCwgZ2R0aF9ldnRfZGF0YSAqZXZ0KQogewogICAg IGdkdGhfZXZ0X3N0ciAqZTsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKIAogICAgIC8qIG5vIEdE VEhfTE9DS19IQSgpICEgKi8KICAgICBUUkFDRTIoKCJnZHRoX3N0b3JlX2V2ZW50KCkgc291cmNl ICVkIGlkeCAlZFxuIiwgc291cmNlLCBpZHgpKTsKQEAgLTI4NTQsOCArMjg1Myw3IEBAIHN0YXRp YyBnZHRoX2V2dF9zdHIgKmdkdGhfc3RvcmVfZXZlbnQoZ2R0aF9oYV9zdHIgKmhhLCB1MTYgc291 cmNlLAogICAgICAgICAgICAgIXN0cmNtcCgoY2hhciAqKSZlYnVmZmVyW2VsYXN0aWR4XS5ldmVu dF9kYXRhLmV2ZW50X3N0cmluZywKICAgICAgICAgICAgIChjaGFyICopJmV2dC0+ZXZlbnRfc3Ry aW5nKSkpKSB7IAogICAgICAgICBlID0gJmVidWZmZXJbZWxhc3RpZHhdOwotICAgICAgICBkb19n ZXR0aW1lb2ZkYXkoJnR2KTsKLSAgICAgICAgZS0+bGFzdF9zdGFtcCA9IHR2LnR2X3NlYzsKKwll LT5sYXN0X3N0YW1wID0gKHUzMilrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCk7CiAgICAgICAgICsr ZS0+c2FtZV9jb3VudDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZWJ1ZmZlcltlbGFzdGlk eF0uZXZlbnRfc291cmNlICE9IDApIHsgIC8qIGVudHJ5IG5vdCBmcmVlID8gKi8KQEAgLTI4NzEs OCArMjg2OSw3IEBAIHN0YXRpYyBnZHRoX2V2dF9zdHIgKmdkdGhfc3RvcmVfZXZlbnQoZ2R0aF9o YV9zdHIgKmhhLCB1MTYgc291cmNlLAogICAgICAgICBlID0gJmVidWZmZXJbZWxhc3RpZHhdOwog ICAgICAgICBlLT5ldmVudF9zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgIGUtPmV2ZW50X2lkeCA9 IGlkeDsKLSAgICAgICAgZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0gICAgICAgIGUtPmZpcnN0X3N0 YW1wID0gZS0+bGFzdF9zdGFtcCA9IHR2LnR2X3NlYzsKKwllLT5maXJzdF9zdGFtcCA9IGUtPmxh c3Rfc3RhbXAgPSAodTMyKWt0aW1lX2dldF9yZWFsX3NlY29uZHMoKTsKICAgICAgICAgZS0+c2Ft ZV9jb3VudCA9IDE7CiAgICAgICAgIGUtPmV2ZW50X2RhdGEgPSAqZXZ0OwogICAgICAgICBlLT5h cHBsaWNhdGlvbiA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZ2R0aF9wcm9jLmMgYi9k cml2ZXJzL3Njc2kvZ2R0aF9wcm9jLmMKaW5kZXggZTY2ZTk5Ny4uYmU2MDlkYiAxMDA2NDQKLS0t IGEvZHJpdmVycy9zY3NpL2dkdGhfcHJvYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9nZHRoX3Byb2Mu YwpAQCAtMTQ4LDcgKzE0OCw2IEBAIGludCBnZHRoX3Nob3dfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUg Km0sIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCiAgICAgZ2R0aF9jbWRfc3RyICpnZHRjbWQ7CiAg ICAgZ2R0aF9ldnRfc3RyICplc3RyOwogICAgIGNoYXIgaHJlY1sxNjFdOwotICAgIHN0cnVjdCB0 aW1ldmFsIHR2OwogCiAgICAgY2hhciAqYnVmOwogICAgIGdkdGhfZHNrc3RhdF9zdHIgKnBkczsK QEAgLTU0MCw4ICs1MzksMTQgQEAgaW50IGdkdGhfc2hvd19pbmZvKHN0cnVjdCBzZXFfZmlsZSAq bSwgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKICAgICAgICAgaWYgKGVzdHItPmV2ZW50X2RhdGEu ZXUuZHJpdmVyLmlvbm9kZSA9PSBoYS0+aGFudW0gJiYKICAgICAgICAgICAgIGVzdHItPmV2ZW50 X3NvdXJjZSA9PSBFU19BU1lOQykgeyAKICAgICAgICAgICAgIGdkdGhfbG9nX2V2ZW50KCZlc3Ry LT5ldmVudF9kYXRhLCBocmVjKTsKLSAgICAgICAgICAgIGRvX2dldHRpbWVvZmRheSgmdHYpOwot ICAgICAgICAgICAgc2VjID0gKGludCkodHYudHZfc2VjIC0gZXN0ci0+Zmlyc3Rfc3RhbXApOwor CisJICAgIC8qCisJICAgICAqIEVsYXBzZWQgc2Vjb25kcyBzdWJ0cmFjdGlvbiB3aXRoIHVuc2ln bmVkIG9wZXJhbmRzIGlzCisJICAgICAqIHNhZmUgZnJvbSB3cmFwIGFyb3VuZCBpbiB5ZWFyIDIx MDYuICBFeGVjdXRlcyBhczoKKwkgICAgICogb3BlcmFuZCBhICsgKDIncyBjb21wbGVtZW50IG9w ZXJhbmQgYikgKyAxCisJICAgICAqLworCisJICAgIHNlYyA9IChpbnQpKCh1MzIpa3RpbWVfZ2V0 X3JlYWxfc2Vjb25kcygpIC0gZXN0ci0+Zmlyc3Rfc3RhbXApOwogICAgICAgICAgICAgaWYgKHNl YyA8IDApIHNlYyA9IDA7CiAgICAgICAgICAgICBzZXFfcHJpbnRmKG0sIiBkYXRlLSAlMDJkOiUw MmQ6JTAyZFx0JXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWMvMzYwMCwgc2Vj JTM2MDAvNjAsIHNlYyU2MCwgaHJlYyk7Ci0tIAoyLjEuNAoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KWTIwMzggbWFpbGluZyBsaXN0ClkyMDM4QGxpc3Rz LmxpbmFyby5vcmcKaHR0cHM6Ly9saXN0cy5saW5hcm8ub3JnL21haWxtYW4vbGlzdGluZm8veTIw MzgK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932665AbbKYAoZ (ORCPT ); Tue, 24 Nov 2015 19:44:25 -0500 Received: from mail-yk0-f179.google.com ([209.85.160.179]:35579 "EHLO mail-yk0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752871AbbKYAoU (ORCPT ); Tue, 24 Nov 2015 19:44:20 -0500 From: Alison Schofield To: achim_leubner@adaptec.com, JBottomley@odin.com, linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, y2038@lists.linaro.org Subject: [PATCH v2] scsi: gdth: replace struct timeval with ktime_get_real_seconds() Date: Tue, 24 Nov 2015 16:44:07 -0800 Message-Id: <1448412247-2716-1-git-send-email-amsfield22@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <20151119214304.GA16713@d830.WORKGROUP> References: <20151119214304.GA16713@d830.WORKGROUP> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org struct timeval will overflow on 32-bit systems in y2038 and is being removed from the kernel. Replace the use of struct timeval and do_gettimeofday() with ktime_get_real_seconds() which provides a 64-bit seconds value and is y2038 safe. gdth driver requires changes in two areas: 1) gdth_store_event() loads two u32 timestamp fields for ioctl GDTIOCTL_EVENT These timestamp fields are part of struct gdth_evt_str used for passing event data to userspace. At the first instance of an event we do (first_stamp=last_stamp="current time"). If that same event repeats, we do (last_stamp="current time") AND increment same_count to indicate how many times the event has repeated since first_stamp. This patch replaces the use of timeval and do_gettimeofday() with ktime_get_real_seconds() cast to u32 to extend the timestamp fields to y2106. Beyond y2106, the userspace tools (ie. RAID controller monitors) can work around the time rollover and this driver would still not need to change. Alternative: The alternative approach is to introduce a new ioctl in gdth with the u32 time fields defined as u64. This would require userspace changes now, but not in y2106. 2) gdth_show_info() calculates elapsed time using u32 first_stamp It is adding events with timestamps to a seq_file. Timestamps are calculated as the "current time" minus the first_stamp. This patch replaces the use of timeval and do_gettimeofday() with ktime_get_real_seconds() cast to u32 to calculate the timestamp. This elapsed time calculation is safe even when the time wraps (beyond y2106) due to how unsigned subtraction works. A comment has been added to the code to indicate this safety. Alternative: This piece itself doesn't warrant an alternative, but if we do introduce a new structure & ioctl with u64 timestamps, this would change accordingly. Signed-off-by: Alison Schofield --- Changes in v2: - remove unnecessary ktime.h includes - add comment in code to explain elapsed time calculation - add detail and alternatives to changelog drivers/scsi/gdth.c | 7 ++----- drivers/scsi/gdth_proc.c | 11 ++++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 71e1380..0a76774 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c @@ -2838,7 +2838,6 @@ static gdth_evt_str *gdth_store_event(gdth_ha_str *ha, u16 source, u16 idx, gdth_evt_data *evt) { gdth_evt_str *e; - struct timeval tv; /* no GDTH_LOCK_HA() ! */ TRACE2(("gdth_store_event() source %d idx %d\n", source, idx)); @@ -2854,8 +2853,7 @@ static gdth_evt_str *gdth_store_event(gdth_ha_str *ha, u16 source, !strcmp((char *)&ebuffer[elastidx].event_data.event_string, (char *)&evt->event_string)))) { e = &ebuffer[elastidx]; - do_gettimeofday(&tv); - e->last_stamp = tv.tv_sec; + e->last_stamp = (u32)ktime_get_real_seconds(); ++e->same_count; } else { if (ebuffer[elastidx].event_source != 0) { /* entry not free ? */ @@ -2871,8 +2869,7 @@ static gdth_evt_str *gdth_store_event(gdth_ha_str *ha, u16 source, e = &ebuffer[elastidx]; e->event_source = source; e->event_idx = idx; - do_gettimeofday(&tv); - e->first_stamp = e->last_stamp = tv.tv_sec; + e->first_stamp = e->last_stamp = (u32)ktime_get_real_seconds(); e->same_count = 1; e->event_data = *evt; e->application = 0; diff --git a/drivers/scsi/gdth_proc.c b/drivers/scsi/gdth_proc.c index e66e997..be609db 100644 --- a/drivers/scsi/gdth_proc.c +++ b/drivers/scsi/gdth_proc.c @@ -148,7 +148,6 @@ int gdth_show_info(struct seq_file *m, struct Scsi_Host *host) gdth_cmd_str *gdtcmd; gdth_evt_str *estr; char hrec[161]; - struct timeval tv; char *buf; gdth_dskstat_str *pds; @@ -540,8 +539,14 @@ int gdth_show_info(struct seq_file *m, struct Scsi_Host *host) if (estr->event_data.eu.driver.ionode == ha->hanum && estr->event_source == ES_ASYNC) { gdth_log_event(&estr->event_data, hrec); - do_gettimeofday(&tv); - sec = (int)(tv.tv_sec - estr->first_stamp); + + /* + * Elapsed seconds subtraction with unsigned operands is + * safe from wrap around in year 2106. Executes as: + * operand a + (2's complement operand b) + 1 + */ + + sec = (int)((u32)ktime_get_real_seconds() - estr->first_stamp); if (sec < 0) sec = 0; seq_printf(m," date- %02d:%02d:%02d\t%s\n", sec/3600, sec%3600/60, sec%60, hrec); -- 2.1.4