-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
dm io tracker: factor out IO tracker
Allow other code to use dm_io_tracker. Signed-off-by: Mike Snitzer <snitzer@redhat.com>
- Loading branch information
Mike Snitzer
committed
Jun 25, 2021
1 parent
b6e58b5
commit dc4fa29
Showing
2 changed files
with
75 additions
and
76 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
* Copyright (C) 2021 Red Hat, Inc. All rights reserved. | ||
* | ||
* This file is released under the GPL. | ||
*/ | ||
|
||
#ifndef DM_IO_TRACKER_H | ||
#define DM_IO_TRACKER_H | ||
|
||
#include <linux/jiffies.h> | ||
|
||
struct dm_io_tracker { | ||
spinlock_t lock; | ||
|
||
/* | ||
* Sectors of in-flight IO. | ||
*/ | ||
sector_t in_flight; | ||
|
||
/* | ||
* The time, in jiffies, when this device became idle | ||
* (if it is indeed idle). | ||
*/ | ||
unsigned long idle_time; | ||
unsigned long last_update_time; | ||
}; | ||
|
||
static inline void dm_iot_init(struct dm_io_tracker *iot) | ||
{ | ||
spin_lock_init(&iot->lock); | ||
iot->in_flight = 0ul; | ||
iot->idle_time = 0ul; | ||
iot->last_update_time = jiffies; | ||
} | ||
|
||
static inline bool dm_iot_idle_for(struct dm_io_tracker *iot, unsigned long j) | ||
{ | ||
bool r = false; | ||
|
||
spin_lock_irq(&iot->lock); | ||
if (!iot->in_flight) | ||
r = time_after(jiffies, iot->idle_time + j); | ||
spin_unlock_irq(&iot->lock); | ||
|
||
return r; | ||
} | ||
|
||
static inline void dm_iot_io_begin(struct dm_io_tracker *iot, sector_t len) | ||
{ | ||
spin_lock_irq(&iot->lock); | ||
iot->in_flight += len; | ||
spin_unlock_irq(&iot->lock); | ||
} | ||
|
||
static inline void dm_iot_io_end(struct dm_io_tracker *iot, sector_t len) | ||
{ | ||
unsigned long flags; | ||
|
||
if (!len) | ||
return; | ||
|
||
spin_lock_irqsave(&iot->lock, flags); | ||
iot->in_flight -= len; | ||
if (!iot->in_flight) | ||
iot->idle_time = jiffies; | ||
spin_unlock_irqrestore(&iot->lock, flags); | ||
} | ||
|
||
#endif |