Files
mirror_zfs/module/zfs
Martin Matuska cddafdcbc5 Illumos #1313: Integer overflow in txg_delay()
The function txg_delay() is used to delay txg (transaction group)
threads in ZFS.  The timeout value for this function is calculated
using:

    int timeout = ddi_get_lbolt() + ticks;

Later, the actual wait is performed:

    while (ddi_get_lbolt() < timeout &&
        tx->tx_syncing_txg < txg-1 && !txg_stalled(dp))
            (void) cv_timedwait(&tx->tx_quiesce_more_cv, &tx->tx_sync_lock,
                timeout - ddi_get_lbolt());

The ddi_get_lbolt() function returns current uptime in clock ticks
and is typed as clock_t.  The clock_t type on 64-bit architectures
is int64_t.

The "timeout" variable will overflow depending on the tick frequency
(e.g. for 1000 it will overflow in 28.855 days). This will make the
expression "ddi_get_lbolt() < timeout" always false - txg threads will
not be delayed anymore at all. This leads to a slowdown in ZFS writes.

The attached patch initializes timeout as clock_t to match the return
value of ddi_get_lbolt().

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #352
2011-08-01 12:09:43 -07:00
..
2011-07-08 12:44:11 -07:00
2010-08-31 08:38:35 -07:00
2010-08-26 14:24:34 -07:00
2011-05-31 12:17:27 -07:00
2011-05-31 12:17:27 -07:00
2010-08-26 14:24:34 -07:00
2010-08-31 13:41:58 -07:00
2011-02-18 09:31:25 -08:00
2010-08-31 13:41:57 -07:00
2010-08-31 13:41:58 -07:00
2011-05-04 10:02:37 -07:00
2011-02-10 09:27:22 -08:00
2010-08-31 08:38:45 -07:00
2011-07-19 11:55:42 -07:00
2010-08-31 13:41:58 -07:00
2010-08-31 13:41:58 -07:00
2011-05-04 10:02:37 -07:00
2011-02-23 12:52:51 -08:00
2011-05-04 10:02:37 -07:00
2010-08-31 13:41:58 -07:00
2011-05-04 10:02:37 -07:00
2010-08-31 08:38:46 -07:00
2010-08-31 08:38:49 -07:00
2011-04-29 12:36:13 -07:00
2010-12-07 16:05:25 -08:00
2011-02-10 09:27:20 -08:00
2010-08-31 13:41:59 -07:00
2010-08-31 13:41:58 -07:00
2010-08-31 13:41:58 -07:00
2010-08-31 13:41:58 -07:00
2010-08-27 15:34:02 -07:00
2010-08-27 15:28:32 -07:00
2011-05-04 10:02:37 -07:00
2010-08-31 08:38:44 -07:00
2010-08-27 15:28:32 -07:00
2011-05-04 10:02:37 -07:00
2010-08-31 13:41:58 -07:00
2010-08-31 08:38:46 -07:00
2011-07-01 13:36:39 -07:00
2010-08-31 13:41:58 -07:00
2011-07-01 13:36:39 -07:00
2010-10-12 14:55:02 -07:00
2011-03-02 11:44:34 -08:00
2011-03-02 11:44:34 -08:00
2010-08-31 13:41:50 -07:00
2011-03-03 11:29:15 -08:00
2011-03-02 11:44:34 -08:00
2011-05-04 10:02:37 -07:00
2011-07-19 16:17:01 -07:00
2011-07-20 14:07:13 -07:00
2011-07-01 13:36:39 -07:00
2011-07-01 13:36:39 -07:00
2010-09-17 16:24:15 -07:00
2011-05-02 08:54:40 -07:00