|
@@ -107,6 +107,16 @@ static inline void zram_set_element(struct zram *zram, u32 index,
|
|
zram->table[index].element = element;
|
|
zram->table[index].element = element;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void zram_accessed(struct zram *zram, u32 index)
|
|
|
|
+{
|
|
|
|
+ zram->table[index].ac_time = sched_clock();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void zram_reset_access(struct zram *zram, u32 index)
|
|
|
|
+{
|
|
|
|
+ zram->table[index].ac_time = 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static unsigned long zram_get_element(struct zram *zram, u32 index)
|
|
static unsigned long zram_get_element(struct zram *zram, u32 index)
|
|
{
|
|
{
|
|
return zram->table[index].element;
|
|
return zram->table[index].element;
|
|
@@ -806,6 +816,8 @@ static void zram_free_page(struct zram *zram, size_t index)
|
|
{
|
|
{
|
|
unsigned long handle;
|
|
unsigned long handle;
|
|
|
|
|
|
|
|
+ zram_reset_access(zram, index);
|
|
|
|
+
|
|
if (zram_test_flag(zram, index, ZRAM_HUGE)) {
|
|
if (zram_test_flag(zram, index, ZRAM_HUGE)) {
|
|
zram_clear_flag(zram, index, ZRAM_HUGE);
|
|
zram_clear_flag(zram, index, ZRAM_HUGE);
|
|
atomic64_dec(&zram->stats.huge_pages);
|
|
atomic64_dec(&zram->stats.huge_pages);
|
|
@@ -1177,6 +1189,10 @@ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index,
|
|
|
|
|
|
generic_end_io_acct(q, rw_acct, &zram->disk->part0, start_time);
|
|
generic_end_io_acct(q, rw_acct, &zram->disk->part0, start_time);
|
|
|
|
|
|
|
|
+ zram_slot_lock(zram, index);
|
|
|
|
+ zram_accessed(zram, index);
|
|
|
|
+ zram_slot_unlock(zram, index);
|
|
|
|
+
|
|
if (unlikely(ret < 0)) {
|
|
if (unlikely(ret < 0)) {
|
|
if (!is_write)
|
|
if (!is_write)
|
|
atomic64_inc(&zram->stats.failed_reads);
|
|
atomic64_inc(&zram->stats.failed_reads);
|