From patchwork Wed Oct 10 10:07:30 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhiyong Wu X-Patchwork-Id: 1572661 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id D4C993FE36 for ; Wed, 10 Oct 2012 10:09:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755180Ab2JJKJH (ORCPT ); Wed, 10 Oct 2012 06:09:07 -0400 Received: from e37.co.us.ibm.com ([32.97.110.158]:37024 "EHLO e37.co.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755107Ab2JJKJD (ORCPT ); Wed, 10 Oct 2012 06:09:03 -0400 Received: from /spool/local by e37.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 10 Oct 2012 04:09:02 -0600 Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e37.co.us.ibm.com (192.168.1.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 10 Oct 2012 04:08:59 -0600 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id B87B41FF003C; Wed, 10 Oct 2012 04:08:52 -0600 (MDT) Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q9AA8wh7189380; Wed, 10 Oct 2012 04:08:58 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q9AA8vZn027082; Wed, 10 Oct 2012 04:08:58 -0600 Received: from us.ibm.com (f15.cn.ibm.com [9.115.122.193]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id q9AA8q6p026583; Wed, 10 Oct 2012 04:08:53 -0600 Received: by us.ibm.com (sSMTP sendmail emulation); Wed, 10 Oct 2012 18:08:52 +0800 From: zwu.kernel@gmail.com To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, linuxram@linux.vnet.ibm.com, viro@zeniv.linux.org.uk, david@fromorbit.com, dave@jikos.cz, tytso@mit.edu, cmm@us.ibm.com, Zhi Yong Wu Subject: [RFC v3 08/13] vfs: add aging function for old map info Date: Wed, 10 Oct 2012 18:07:30 +0800 Message-Id: <1349863655-29320-9-git-send-email-zwu.kernel@gmail.com> X-Mailer: git-send-email 1.7.6.5 In-Reply-To: <1349863655-29320-1-git-send-email-zwu.kernel@gmail.com> References: <1349863655-29320-1-git-send-email-zwu.kernel@gmail.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12101010-7408-0000-0000-000009305302 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org From: Zhi Yong Wu Signed-off-by: Zhi Yong Wu --- fs/hot_tracking.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/hot_tracking.h | 6 +++++ 2 files changed, 63 insertions(+), 0 deletions(-) diff --git a/fs/hot_tracking.c b/fs/hot_tracking.c index 717faa7..a8dc599 100644 --- a/fs/hot_tracking.c +++ b/fs/hot_tracking.c @@ -376,6 +376,24 @@ inline void hot_update_freqs(struct hot_info *root, hot_inode_item_put(he); } +static bool hot_freq_data_is_aging(struct hot_freq_data *freq_data) +{ + int ret = 0; + struct timespec ckt = current_kernel_time(); + + u64 cur_time = timespec_to_ns(&ckt); + u64 last_read_ns = + (cur_time - timespec_to_ns(&freq_data->last_read_time)); + u64 last_write_ns = + (cur_time - timespec_to_ns(&freq_data->last_write_time)); + u64 kick_ns = TIME_TO_KICK * (u64)1000000000; + + if ((last_read_ns > kick_ns) && (last_write_ns > kick_ns)) + ret = 1; + + return ret; +} + static u64 hot_raw_shift(u64 counter, u32 bits, bool dir) { if (dir) @@ -529,6 +547,45 @@ static void hot_map_array_update(struct hot_freq_data *freq_data, } } +/* Update temperatures for each range item for aging purposes */ +static void hot_range_update(struct hot_inode_item *he, + struct hot_info *root) +{ + struct hot_range_item *hr_nodes[8]; + u32 start = 0; + bool range_is_aging; + int i, n; + + while (1) { + spin_lock(&he->lock); + n = radix_tree_gang_lookup(&he->hot_range_tree, + (void **)hr_nodes, start, + ARRAY_SIZE(hr_nodes)); + if (!n) { + spin_unlock(&he->lock); + break; + } + + start = hr_nodes[n - 1]->start + 1; + for (i = 0; i < n; i++) { + kref_get(&hr_nodes[i]->hot_range.refs); + hot_map_array_update( + &hr_nodes[i]->hot_range.hot_freq_data, root); + + spin_lock(&hr_nodes[i]->hot_range.lock); + range_is_aging = hot_freq_data_is_aging( + &hr_nodes[i]->hot_range.hot_freq_data); + spin_unlock(&hr_nodes[i]->hot_range.lock); + + hot_range_item_put(hr_nodes[i]); + if (range_is_aging) { + hot_range_item_put(hr_nodes[i]); + } + } + spin_unlock(&he->lock); + } +} + /* * Initialize inode and range map arrays. */ diff --git a/fs/hot_tracking.h b/fs/hot_tracking.h index 5a9517b..d19e64a 100644 --- a/fs/hot_tracking.h +++ b/fs/hot_tracking.h @@ -31,6 +31,12 @@ #define FREQ_POWER 4 /* + * time to quit keeping track of + * tracking data (seconds) + */ +#define TIME_TO_KICK 400 + +/* * The following comments explain what exactly comprises a unit of heat. * * Each of six values of heat are calculated and combined in order to form an