Message ID | 1599661096-127913-10-git-send-email-zhengchuan@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | *** A Method for evaluating dirty page rate *** | expand |
Chuan Zheng <zhengchuan@huawei.com> 于2020年9月9日周三 下午10:15写道: > > Implement set_sample_page_period()/get_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> > --- > migration/dirtyrate.c | 24 ++++++++++++++++++++++++ > migration/dirtyrate.h | 6 ++++++ > 2 files changed, 30 insertions(+) > > diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c > index ae1959b..8a30261 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 get_sample_page_period(int64_t sec) This function name may confuse people the this will get the period. But in fact you just check whether the 'period' is valid. I think it is better to name it to be 'is_sample_period_valid' or something meaningful. Thanks, Li Qiang > +{ > + 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 > >
On 2020/9/10 21:59, Li Qiang wrote: > Chuan Zheng <zhengchuan@huawei.com> 于2020年9月9日周三 下午10:15写道: >> >> Implement set_sample_page_period()/get_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> >> --- >> migration/dirtyrate.c | 24 ++++++++++++++++++++++++ >> migration/dirtyrate.h | 6 ++++++ >> 2 files changed, 30 insertions(+) >> >> diff --git a/migration/dirtyrate.c b/migration/dirtyrate.c >> index ae1959b..8a30261 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 get_sample_page_period(int64_t sec) > > > This function name may confuse people the this will get the period. > But in fact you just check whether the 'period' is valid. > I think it is better to name it to be 'is_sample_period_valid' or > something meaningful. > > Thanks, > Li Qiang > Sure, will optimize it in later patch update. >> +{ >> + 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 ae1959b..8a30261 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 get_sample_page_period(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 */