From patchwork Thu Jun 17 13:01:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Hyman Huang X-Patchwork-Id: 1493499 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4G5MqT6kh6z9s5R for ; Thu, 17 Jun 2021 23:10:29 +1000 (AEST) Received: from localhost ([::1]:48800 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ltrmt-0001vt-LG for incoming@patchwork.ozlabs.org; Thu, 17 Jun 2021 09:10:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41822) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ltraG-00048M-C4 for qemu-devel@nongnu.org; Thu, 17 Jun 2021 08:57:24 -0400 Received: from prt-mail.chinatelecom.cn ([42.123.76.228]:47975 helo=chinatelecom.cn) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ltraC-00057Y-Br for qemu-devel@nongnu.org; Thu, 17 Jun 2021 08:57:24 -0400 HMM_SOURCE_IP: 172.18.0.218:49202.1515610665 HMM_ATTACHE_NUM: 0000 HMM_SOURCE_TYPE: SMTP Received: from clientip-202.80.192.39?logid-ac66d9f6950e4d63a4038c372b328dd9 (unknown [172.18.0.218]) by chinatelecom.cn (HERMES) with SMTP id 543932800DD; Thu, 17 Jun 2021 20:57:05 +0800 (CST) X-189-SAVE-TO-SEND: +huangy81@chinatelecom.cn Received: from ([172.18.0.218]) by app0025 with ESMTP id ac66d9f6950e4d63a4038c372b328dd9 for qemu-devel@nongnu.org; Thu Jun 17 20:57:06 2021 X-Transaction-ID: ac66d9f6950e4d63a4038c372b328dd9 X-filter-score: filter<0> X-Real-From: huangy81@chinatelecom.cn X-Receive-IP: 172.18.0.218 X-MEDUSA-Status: 0 From: huangy81@chinatelecom.cn To: qemu-devel@nongnu.org Subject: [PATCH v5 0/6] support dirtyrate at the granualrity of vcpu Date: Thu, 17 Jun 2021 21:01:15 +0800 Message-Id: X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Received-SPF: pass client-ip=42.123.76.228; envelope-from=huangy81@chinatelecom.cn; helo=chinatelecom.cn X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Eduardo Habkost , Juan Quintela , Hyman , "Dr. David Alan Gilbert" , Peter Xu , Chuan Zheng , Paolo Bonzini Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Hyman Huang(黄勇) v5: - rename global_dirty_log to global_dirty_tracking on Peter's advice - make global_dirty_tracking a bitmask: 1. add assert statement to ensure starting dirty tracking repeatly not allowed. 2. add assert statement to ensure dirty tracking cannot be stopped without having been started. - protecting dirty rate stat info: 1. drop the mutext for protecting dirty rate introduced in version 4 2. change the code block in query_dirty_rate_info so that requirements of "safe racing" to the dirty rate stat can be meet - make the helper function "record_dirtypages" inline and change the global var dirty_pages to local var - free DirtyRateVcpuList in case of memory leak please review, thanks a lot. v4: - make global_dirty_log a bitmask: 1. add comments about dirty log bitmask 2. use assert statement to check validity of flags 3. add trace to log bitmask changes - introduce mode option to show what method calculation should be used, also, export mode option in the as last commmit - split cleanup and init of dirty rate stat and move it in the main thread - change the fields of DirtyPageRecord to uint64_t type so that we can calculation the increased dirty pages with the formula as Peter's advice: dirty pages = end_pages - start_pages - introduce mutex to protect dirty rate stat info - adjust order of registering thread - drop the memory free callback this version modify some code on Peter's advice, reference to: https://lore.kernel.org/qemu-devel/YL5nNYXmrqMlXF3v@t490s/ thanks again. v3: - pick up "migration/dirtyrate: make sample page count configurable" to make patchset apply master correctly v2: - rebase to "migration/dirtyrate: make sample page count configurable" - rename "vcpu" to "per_vcpu" to show the per-vcpu method - squash patch 5/6 into a single one, squash patch 1/2 also - pick up "hmp: Add "calc_dirty_rate" and "info dirty_rate" cmds" - make global_dirty_log a bitmask to make sure both migration and dirty could not intefer with each other - add memory free callback to prevent memory leaking the most different of v2 fron v1 is that we make the global_dirty_log a bitmask. the reason is dirty rate measurement may start or stop dirty logging during calculation. this conflict with migration because stop dirty log make migration leave dirty pages out then that'll be a problem. make global_dirty_log a bitmask can let both migration and dirty rate measurement work fine. introduce GLOBAL_DIRTY_MIGRATION and GLOBAL_DIRTY_DIRTY_RATE to distinguish what current dirty log aims for, migration or dirty rate. all references to global_dirty_log should be untouched because any bit set there should justify that global dirty logging is enabled. Please review, thanks ! v1: Since the Dirty Ring on QEMU part has been merged recently, how to use this feature is under consideration. In the scene of migration, it is valuable to provide a more accurante interface to track dirty memory than existing one, so that the upper layer application can make a wise decision, or whatever. More importantly, dirtyrate info at the granualrity of vcpu could provide a possibility to make migration convergent by imposing restriction on vcpu. With Dirty Ring, we can calculate dirtyrate efficiently and cheaply. The old interface implemented by sampling pages, it consumes cpu resource, and the larger guest memory size become, the more cpu resource it consumes, namely, hard to scale. New interface has no such drawback. Please review, thanks ! Best Regards ! Hyman Huang(黄勇) (6): memory: rename global_dirty_log to global_dirty_tracking memory: make global_dirty_tracking a bitmask migration/dirtyrate: introduce struct and adjust DirtyRateStat migration/dirtyrate: adjust order of registering thread migration/dirtyrate: move init step of calculation to main thread migration/dirtyrate: implement dirty-ring dirtyrate calculation hmp-commands.hx | 7 +- include/exec/memory.h | 18 +++- include/exec/ram_addr.h | 4 +- migration/dirtyrate.c | 260 +++++++++++++++++++++++++++++++++++++++++------- migration/dirtyrate.h | 19 +++- migration/ram.c | 8 +- migration/trace-events | 2 + qapi/migration.json | 46 ++++++++- softmmu/memory.c | 36 +++++-- softmmu/trace-events | 1 + 10 files changed, 339 insertions(+), 62 deletions(-)