From patchwork Thu Sep 10 00:08:56 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Herrenschmidt X-Patchwork-Id: 516067 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 73211140281 for ; Thu, 10 Sep 2015 10:09:24 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 5700A1A2A82 for ; Thu, 10 Sep 2015 10:09:24 +1000 (AEST) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id D38F81A0795 for ; Thu, 10 Sep 2015 10:09:15 +1000 (AEST) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.13.8) with ESMTP id t8A08v25008947 for ; Wed, 9 Sep 2015 19:09:03 -0500 Message-ID: <1441843736.26961.15.camel@kernel.crashing.org> From: Benjamin Herrenschmidt To: skiboot@lists.ozlabs.org Date: Thu, 10 Sep 2015 10:08:56 +1000 X-Mailer: Evolution 3.16.5 (3.16.5-1.fc22) Mime-Version: 1.0 Subject: [Skiboot] [PATCH 1/3] timer: Pass current timer to timer callbacks X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" The caller usually has it and it avoids additional mftb() which can be expensive. Signed-off-by: Benjamin Herrenschmidt --- core/timer.c | 8 ++++---- hw/bt.c | 13 ++++++------- hw/ipmi/ipmi-watchdog.c | 3 ++- hw/p8-i2c.c | 17 ++++++++++------- include/timer.h | 2 +- 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/core/timer.c b/core/timer.c index 737fb78..d5a3477 100644 --- a/core/timer.c +++ b/core/timer.c @@ -109,7 +109,7 @@ uint64_t schedule_timer(struct timer *t, uint64_t how_long) return now; } -static void __check_poll_timers(void) +static void __check_poll_timers(uint64_t now) { struct timer *t; @@ -153,7 +153,7 @@ static void __check_poll_timers(void) /* Now we can unlock and call it's expiry */ unlock(&timer_lock); - t->expiry(t, t->user_data); + t->expiry(t, t->user_data, now); /* Re-lock and mark not running */ lock(&timer_lock); @@ -187,7 +187,7 @@ static void __check_timers(uint64_t now) /* Now we can unlock and call it's expiry */ unlock(&timer_lock); - t->expiry(t, t->user_data); + t->expiry(t, t->user_data, now); /* Re-lock and mark not running */ lock(&timer_lock); @@ -216,7 +216,7 @@ void check_timers(bool from_interrupt) /* Take lock and try again */ lock(&timer_lock); if (!from_interrupt) - __check_poll_timers(); + __check_poll_timers(now); __check_timers(now); unlock(&timer_lock); } diff --git a/hw/bt.c b/hw/bt.c index 23fc68c..41fe24e 100644 --- a/hw/bt.c +++ b/hw/bt.c @@ -293,12 +293,10 @@ static void bt_get_resp(void) return; } -static void bt_expire_old_msg(void) +static void bt_expire_old_msg(uint64_t tb) { - unsigned long tb; struct bt_msg *bt_msg; - tb = mftb(); bt_msg = list_top(&bt.msgq, struct bt_msg, link); if (bt_msg && bt_msg->tb > 0 && (bt_msg->tb + BT_MSG_TIMEOUT) < tb) { @@ -309,7 +307,7 @@ static void bt_expire_old_msg(void) FIFO so just reset the flag.*/ BT_ERR(bt_msg, "Retry sending message"); bt_msg->retry_count++; - bt_msg->tb = mftb(); + bt_msg->tb = tb; bt_outb(BT_CTRL_H2B_ATN, BT_CTRL); } else { BT_ERR(bt_msg, "Timeout sending message"); @@ -356,7 +354,8 @@ static void bt_send_and_unlock(void) return; } -static void bt_poll(struct timer *t __unused, void *data __unused) +static void bt_poll(struct timer *t __unused, void *data __unused, + uint64_t now) { uint8_t bt_ctrl; @@ -369,7 +368,7 @@ static void bt_poll(struct timer *t __unused, void *data __unused) lock(&bt.lock); print_debug_queue_info(); - bt_expire_old_msg(); + bt_expire_old_msg(now); bt_ctrl = bt_inb(BT_CTRL); @@ -447,7 +446,7 @@ static void bt_irq(uint32_t chip_id __unused, uint32_t irq_mask __unused) bt.irq_ok = true; if (ireg & BT_INTMASK_B2H_IRQ) { bt_outb(BT_INTMASK_B2H_IRQ | BT_INTMASK_B2H_IRQEN, BT_INTMASK); - bt_poll(NULL, NULL); + bt_poll(NULL, NULL, mftb()); } } diff --git a/hw/ipmi/ipmi-watchdog.c b/hw/ipmi/ipmi-watchdog.c index 7dfb0c0..55c3bf5 100644 --- a/hw/ipmi/ipmi-watchdog.c +++ b/hw/ipmi/ipmi-watchdog.c @@ -100,7 +100,8 @@ static void sync_reset_wdt(void) ipmi_queue_msg_sync(ipmi_msg); } -static void reset_wdt(struct timer *t __unused, void *data __unused) +static void reset_wdt(struct timer *t __unused, void *data __unused, + uint64_t now __unused) { struct ipmi_msg *ipmi_msg; diff --git a/hw/p8-i2c.c b/hw/p8-i2c.c index dfb26d4..848d400 100644 --- a/hw/p8-i2c.c +++ b/hw/p8-i2c.c @@ -1048,7 +1048,7 @@ static inline uint64_t p8_i2c_get_poll_interval(uint32_t bus_speed) return usecs_to_tb(usec); } -static void p8_i2c_timeout(struct timer *t __unused, void *data) +static void p8_i2c_timeout(struct timer *t __unused, void *data, uint64_t now) { struct p8_i2c_master_port *port; struct p8_i2c_master *master = data; @@ -1073,7 +1073,7 @@ static void p8_i2c_timeout(struct timer *t __unused, void *data) goto exit; } request = container_of(req, struct p8_i2c_request, req); - if (tb_compare(mftb(), request->timeout) == TB_ABEFOREB) { + if (tb_compare(now, request->timeout) == TB_ABEFOREB) { DBG("I2C: Timeout with request not expired\n"); goto exit; } @@ -1094,12 +1094,14 @@ static void p8_i2c_timeout(struct timer *t __unused, void *data) unlock(&master->lock); } -static void p8_i2c_recover(struct timer *t __unused, void *data) +static void p8_i2c_recover(struct timer *t __unused, void *data, + uint64_t now __unused) { struct p8_i2c_master *master = data; lock(&master->lock); - assert(master->state == state_recovery || master->state == state_occache_dis); + assert(master->state == state_recovery || + master->state == state_occache_dis); master->state = state_idle; /* We may or may not still have work pending, re-enable the sensor cache @@ -1117,7 +1119,8 @@ static void p8_i2c_recover(struct timer *t __unused, void *data) unlock(&master->lock); } -static void p8_i2c_enable_scache(struct timer *t __unused, void *data) +static void p8_i2c_enable_scache(struct timer *t __unused, void *data, + uint64_t now __unused) { struct p8_i2c_master *master = data; @@ -1132,7 +1135,7 @@ static void p8_i2c_enable_scache(struct timer *t __unused, void *data) unlock(&master->lock); } -static void p8_i2c_poll(struct timer *t __unused, void *data) +static void p8_i2c_poll(struct timer *t __unused, void *data, uint64_t now) { struct p8_i2c_master *master = data; @@ -1149,7 +1152,7 @@ static void p8_i2c_poll(struct timer *t __unused, void *data) lock(&master->lock); p8_i2c_check_status(master); if (master->state != state_idle) - schedule_timer(&master->poller, master->poll_interval); + schedule_timer_at(&master->poller, now + master->poll_interval); p8_i2c_check_work(master); unlock(&master->lock); } diff --git a/include/timer.h b/include/timer.h index a1132e0..116b9ac 100644 --- a/include/timer.h +++ b/include/timer.h @@ -6,7 +6,7 @@ struct timer; -typedef void (*timer_func_t)(struct timer *t, void *data); +typedef void (*timer_func_t)(struct timer *t, void *data, uint64_t now); /* Structure exposed in order to be able to allocate it * statically but otherwise, use accessors, don't access