Message ID | 1600137887-58739-10-git-send-email-zhengchuan@huawei.com |
---|---|
State | Superseded |
Headers | show |
Series | *** A Method for evaluating dirty page rate *** | expand |
Chuan Zheng <zhengchuan@huawei.com> 于2020年9月15日周二 上午10:34写道: > > Implement is_sample_period_valid() to check if the sample period is vaild and > do set_sample_page_period() to sleep specific time between sample actions. > > Signed-off-by: Chuan Zheng <zhengchuan@huawei.com> > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> > Reviewed-by: David Edmondson <david.edmondson@oracle.com> Reviewed-by: Li Qiang <liq3ea@gmail.com> > --- > migration/dirtyrate.c | 24 ++++++++++++++++++++++++ > migration/dirtyrate.h | 6 ++++++ > 2 files changed, 30 insertions(+) > > diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c > index 903f728..bcff10e 100644 > --- a/migration/dirtyrate.c > +++ b/migration/dirtyrate.c > @@ -27,6 +27,30 @@ > static int CalculatingState = DIRTY_RATE_STATUS_UNSTARTED; > static struct DirtyRateStat DirtyStat; > > +static int64_t set_sample_page_period(int64_t msec, int64_t initial_time) > +{ > + int64_t current_time; > + > + current_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); > + if ((current_time - initial_time) >= msec) { > + msec = current_time - initial_time; > + } else { > + g_usleep((msec + initial_time - current_time) * 1000); > + } > + > + return msec; > +} > + > +static bool is_sample_period_valid(int64_t sec) > +{ > + if (sec < MIN_FETCH_DIRTYRATE_TIME_SEC || > + sec > MAX_FETCH_DIRTYRATE_TIME_SEC) { > + return false; > + } > + > + return true; > +} > + > static int dirtyrate_set_state(int *state, int old_state, int new_state) > { > assert(new_state < DIRTY_RATE_STATUS__MAX); > diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h > index faaf9da..8f9bc80 100644 > --- a/migration/dirtyrate.h > +++ b/migration/dirtyrate.h > @@ -29,6 +29,12 @@ > */ > #define MIN_RAMBLOCK_SIZE 128 > > +/* > + * Take 1s as minimum time for calculation duration > + */ > +#define MIN_FETCH_DIRTYRATE_TIME_SEC 1 > +#define MAX_FETCH_DIRTYRATE_TIME_SEC 60 > + > struct DirtyRateConfig { > uint64_t sample_pages_per_gigabytes; /* sample pages per GB */ > int64_t sample_period_seconds; /* time duration between two sampling */ > -- > 1.8.3.1 >
diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c index 903f728..bcff10e 100644 --- a/migration/dirtyrate.c +++ b/migration/dirtyrate.c @@ -27,6 +27,30 @@ static int CalculatingState = DIRTY_RATE_STATUS_UNSTARTED; static struct DirtyRateStat DirtyStat; +static int64_t set_sample_page_period(int64_t msec, int64_t initial_time) +{ + int64_t current_time; + + current_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); + if ((current_time - initial_time) >= msec) { + msec = current_time - initial_time; + } else { + g_usleep((msec + initial_time - current_time) * 1000); + } + + return msec; +} + +static bool is_sample_period_valid(int64_t sec) +{ + if (sec < MIN_FETCH_DIRTYRATE_TIME_SEC || + sec > MAX_FETCH_DIRTYRATE_TIME_SEC) { + return false; + } + + return true; +} + static int dirtyrate_set_state(int *state, int old_state, int new_state) { assert(new_state < DIRTY_RATE_STATUS__MAX); diff --git a/migration/dirtyrate.h b/migration/dirtyrate.h index faaf9da..8f9bc80 100644 --- a/migration/dirtyrate.h +++ b/migration/dirtyrate.h @@ -29,6 +29,12 @@ */ #define MIN_RAMBLOCK_SIZE 128 +/* + * Take 1s as minimum time for calculation duration + */ +#define MIN_FETCH_DIRTYRATE_TIME_SEC 1 +#define MAX_FETCH_DIRTYRATE_TIME_SEC 60 + struct DirtyRateConfig { uint64_t sample_pages_per_gigabytes; /* sample pages per GB */ int64_t sample_period_seconds; /* time duration between two sampling */