From patchwork Wed Sep 20 23:53:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Roche X-Patchwork-Id: 1837438 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=oracle.com header.i=@oracle.com header.a=rsa-sha256 header.s=corp-2023-03-30 header.b=VAAQQaX/; dkim=pass (1024-bit key; unprotected) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-oracle-onmicrosoft-com header.b=X1hCHqJd; dkim-atps=neutral Authentication-Results: legolas.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=patchwork.ozlabs.org) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4Rrb3f4yVHz1ypF for ; Thu, 21 Sep 2023 09:54:20 +1000 (AEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qj70P-0001O0-7x; Wed, 20 Sep 2023 19:53:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qj70N-0001NX-NM for qemu-devel@nongnu.org; Wed, 20 Sep 2023 19:53:15 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qj70L-0003Je-7f for qemu-devel@nongnu.org; Wed, 20 Sep 2023 19:53:15 -0400 Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 38KKJ0HP003969; Wed, 20 Sep 2023 23:53:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2023-03-30; bh=hI3Om5d9SbLQRpmi6J1x5iGukeOEHserbUHygRbxZFc=; b=VAAQQaX/NP4Ub4ESQvm6XQzXDDcvfL/29lSSpQs7Sy/pBJcMWM0EROo3yvnpV7gxaZGs 21wVSuK+KJDxGEJUSXR6ENP76DqSPoL/JiV9bBCwnRQXtDU9xalVi+zP4vApFXsXNQA/ w2GqsdgXXr5QFUcSCNDBmU5cQgqKHW2gOvz1Z05OIg9ksPN5fIOpS+IhHgQT6HyA8MWy MNpCK20iLrEWtsHb60hZpbjREozpQ4RGERd4yo0rCRBRyB98mtnoyWGnlv39nA2rf7HR hClozZqJdzcDFQ0KvtAq8TPRIdg66NYRvWaGxf/Wldng9DQDnDFyWGjwBL9wfDl15SF2 Pw== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3t53530m62-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 20 Sep 2023 23:53:10 +0000 Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 38KLUXvJ027258; Wed, 20 Sep 2023 23:53:09 GMT Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10lp2103.outbound.protection.outlook.com [104.47.58.103]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3t52t81f4x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 20 Sep 2023 23:53:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cqXRHrZ3HTsdMQksM008vsbRh9BDkV12LtjWOVXcYvg077ZZiPa/UVQRgXQh5FzrWTV+oV/r7zZuA2OwtlooMHlpXudfJC6OiLl93AsLhx5GgT1aZ0yLP1eFl/vgNkURtV1m/cYUDtzLxiUuv3EQmY1o9jnS2u0y+QBLqLVbFlMFOFGjqnaCmmH9TEkUhcjSUMK8bzwt54GIJQ+RD5Sn9IZ6eyN8ER7eWw8m1wtJnS4TDsosXFr7hV2Fp/uBxyX3bGuRyOSFO5/pCQV6gh97K+3OUd4i4uEhDQgPtJdUXln56aOf1uJH8eSNAH0bah23E0E6GTKXdPKjTnZMW4/u9A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hI3Om5d9SbLQRpmi6J1x5iGukeOEHserbUHygRbxZFc=; b=jxToadxuDF4xtHT03aomYBd5Oyqos9+BkzKgP6L9GhLBZ0603PnfFVR/gaUwg5dUKccJHQq2TMeT+quMmV8Zx0yPjs+B/oy9btcmqoMpVYG/HAanfz79KUS4XuJVfLEdYWi3TL9i1m0L4dJStjfIcxZTEZ8m1Df9FobjaiRsdbc/UARjvsrW53enhG80Rz2E4el9lcFt7NdL/QyvmAmqpBgHLaiDcoOG+ykEtAh0s6iSlMY3Tlns7YgW3SHQRMSRyU/0MxvRj2QdfNVUdI04W7xS/9EbVjB6uy0avkv+GxkL95JmngOTdRTxYAwNX0s8KLiL5eeA3LuAYijLBKyXmg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hI3Om5d9SbLQRpmi6J1x5iGukeOEHserbUHygRbxZFc=; b=X1hCHqJdD0PnqQS7AbBsxy+3+5f9lYWUpy+9dekNXA2RInq07yfVo72033ICHI4VkbkXQ7AqecMIoO+7UZoh3pbbLFjOnc/hgIkAPeZ/eI8C/fP4Ro/QmPbEBb93fMZAvZ//TnPISlYz9UvXq2XTO8+8JIaVgMtBDIjbcOl0hME= Received: from PH0PR10MB5481.namprd10.prod.outlook.com (2603:10b6:510:ea::5) by PH8PR10MB6480.namprd10.prod.outlook.com (2603:10b6:510:22c::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6792.28; Wed, 20 Sep 2023 23:53:07 +0000 Received: from PH0PR10MB5481.namprd10.prod.outlook.com ([fe80::487d:5c37:8928:9885]) by PH0PR10MB5481.namprd10.prod.outlook.com ([fe80::487d:5c37:8928:9885%4]) with mapi id 15.20.6792.026; Wed, 20 Sep 2023 23:53:06 +0000 From: =?utf-8?q?=E2=80=9CWilliam_Roche?= To: qemu-devel@nongnu.org, peterx@redhat.com, lizhijian@fujitsu.com Cc: pbonzini@redhat.com, quintela@redhat.com, leobras@redhat.com, joao.m.martins@oracle.com, lidongchen@tencent.com, william.roche@oracle.com Subject: [PATCH v3 1/1] migration: skip poisoned memory pages on "ram saving" phase Date: Wed, 20 Sep 2023 23:53:01 +0000 Message-Id: <20230920235301.1622672-2-william.roche@oracle.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20230920235301.1622672-1-william.roche@oracle.com> References: <128792ce-e3aa-a357-5e96-a4d8211193d6@fujitsu.com> <20230920235301.1622672-1-william.roche@oracle.com> X-ClientProxiedBy: BYAPR11CA0062.namprd11.prod.outlook.com (2603:10b6:a03:80::39) To PH0PR10MB5481.namprd10.prod.outlook.com (2603:10b6:510:ea::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH0PR10MB5481:EE_|PH8PR10MB6480:EE_ X-MS-Office365-Filtering-Correlation-Id: ab3231ee-0bea-457e-2ecd-08dbba34bc91 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: a8My0fQbKC3VywmGmDUo7msvpx8+Cfs0vCfzCJHwlxkr4FkGksNpOjmiHznLHVgSCIdnXGShHqQB/nVUQKjZPqigVjdfTLGZK/Q88kOftP8krVGHxS5okzNSeZNkhiXpGaOMD4ROyZCzlzoxkpeJ/O9dKckCgYSsUO0Q267wfg6tWE/J8wNrewiozqlOxk4nbJvCheGKmsW96Gnw2SMwiqCp6z5T8ZcxiTNH2XUZDLwBMbUDAPEfK8hheVJG80v3m/FtR1PvImveVqLlmmpdrCgR5RsHrqzp6SjGfL4J5U8fb8SQg0geN3lsTJUodn6Wwt9hL9qdUdV1PiYNOoRjoloGFZoNzEkIthC1O+7dIfPwAtKogXWZFMpaXEwiKoCda4FLaAuFECIwMALPMB65ksHlzLj0rsW7y5FOGsuePygAQQCTExCj+G3KYsu58WztJ1rODb3gfTAl6VTbLZBSipoDK0jD59yZWrF38FZc9w8N2DNV8TTXMNVkMXVOxxucdnAjK9yGGoeI4RM0PZE4W0EMuJOvT7TH1/lgVYPvHK9bBc5AGUeFPS0+dC9/aL2W X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PH0PR10MB5481.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(366004)(346002)(136003)(39860400002)(376002)(396003)(1800799009)(186009)(451199024)(6666004)(6486002)(6506007)(478600001)(6512007)(26005)(5660300002)(83380400001)(4326008)(107886003)(2616005)(2906002)(316002)(1076003)(66476007)(66556008)(8676002)(66946007)(8936002)(41300700001)(38100700002)(36756003)(86362001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: TMGCf9bUg1lKMKf6E6PAZlGWQQfOJBUXPfAUMVWtlPjA/C69Nj4jtX/qyy82KRhNpTz5A5la9+gvSSOb5rPWNDWLPNrYHnizNCUgM29Rz0uCMnEDdulB0VLFVUVkT8Jv9Q9LAeC2H3RdVAsz2+BHWkat+444Vh6Iqgf+LFoW77tK91FMrO4AQbt3nRNduYgrLrLsJ4n2eFRuAFOH7ptvq8aCB2+FFRGNzzoHXckjQmOHlFFvMap/fEVH6IArSfkuYnxyyfplfEDkSmqIigUSl44HTMBKNqYJ2WqFZB5muz+YihBJfJqXjKWAkpDHyvqKnMo73KUC2eVezrJl1cpGKQVJn/SsVKxrHbSyEjKapHi3ypXCrx8AnNTqkijvTMFhJs3y3DOtbtw4h+R4OQHrMJ+A4YR5fBcvBZmqdCu1DPVWEiDRrB9iIUqpk+BfueqqDjdx9iKtLM5nQjr3f3mCyzd81bM+mOOtbsDpAw2o24DLvGpb2weDLva5fIqu5hVrTt3zGyYtmqIQCbVOuPR0vZpdul8g3VhmddKHfBVS42BSHEfhZHC9RoSp/CSwOe26Fs7XyPT9dMMDkF2/4M2C+DidQIX7WKylUMqsNVU0kazYi5XtuabXKQ57VhMvdNhARxPCsBEA2ooz3Nt+EGG58uuSaARBDxaPOnHcg6QepaegqYG74V+wZikaSsrG395EN9B+0rKHOlm+oMRXNKzSqWOCWLDDl3xpyflhnTXHxhgyLfSbZE3bCkbI5jAxtFiEJLd2L2bmd0cjAtP3q5EnpcofDTZgDvCTk6IDqeN7IZwDtEpYE4ZPpAFeAeQEg/YQdqohJjs7Z2rvNFs1GpdxgPwQmUsItRC5jTjZkD4hBwMhRaFRn02grDJigUTgoFAVrQ4/yMy9P6QDaVe+u2Rb/MbBhz7pd19/ekbDt5J56ZymZE7cqcpZ84fRueBjRfKRM+YRLPFwm2OW/qaw9Ia49mVwilVWcJFTkWG0I+ztB6qckmzcu2qc3ZfKFd/7tHGTVTq17+PtUKBomHIP8y8yX67NA0fBc4flJ1e5Udw/U88k6fZ3gCylrd/BPQECdbnS+JhxOYeD9lHZvzfl6ttqSBSHWhr9sih1j8nXQRb9TUGcadqNOw3U93GKJUXXvsFw6ZEoCW4plzJtxiiDKBbaq1IJwBgRlzBB5J8pnmlkqH96Yuh/9v2oIAHJWqwfnBqmmZKE8p0mFtBXESREtvk9pl4tA6kL4v0c8fjlGKSdRtxtKRrfxIEmLl9TIpdRhMC70x6JmUbuscPBuE409cosM6FifWoI95Sq4YzQKrypU6RDU8Ol5GvEXAf+ieggEGsSkNotDbKHGLfdPRIk5TBXW3IE+bVqDBhOLDBPO+Ob/1Tyg6ioJF4TMQ1qS0muQVCYSSZZkI7WIq9Epsf6tOofHEuttqxigbH/wbBX3mf60csjSn/OjH8btGlwwobNAUHiuh/S7LqhKkCjydd1ggrObye07hDN3LnABgLPL8dk7eJvJP8jNdYeehGtuhYUFV+8zLvxZkzeDiFEsOLX72IcKGzgkVVGhSjaGX9pHNC+m9W38u7/b++pxuwXJFqC08UmDUsyUqtj6bGtUkrrdzAo/A== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 25N1ugJ2bRW1ZLnReSsV5JKL0d1R++C9Y8HlvQ/xrBGLTHBJ+55CQr8yRnUynXvxz5tWAtElzFaiW6Og3YNQfp2xi32MTjqvniwpdmgsU8cPemsvSziNkYO7XLteiEVvHliObFNsDDNOoNIA2cdaoPG9KZNymF+l5dTvnNdrrp5RiewhKyDn1cenQnnsbuPlJyb/WeiJZwC6F1pJ/Udo6H7rMGmlO5+XrS8KyMmAgK16+avN0Z/1G7VQ8aqGPsJAR0kgB0gEURoxt0m3+6jhaRnfnF0iNKMuJwsfVrCEfDpSrYEO4B76Ph2+NWmkGhjra3DBjTuIZO+v0gad5rn4wR7/BWHlvGp3rF2AvOxul+/mVKfLUvGtAbjLuh/x8h1wPCl3WbVD7O3cjoQJvwm9Fo+TC52ZUkSvTMTS/OFMGEJjPFD2OKGE5jHYHmjqkjyOOpxr4QwDVwv5U15wdfjPqZkbQ3QuIFLFU1cUaJXkjT3BawKJRbgItTYT17otdYhCL1KfVqdsMksplSbZHe7jLku+AndoIt5L0R7Seb4U2wlXkFwntRWajm+/CVZfYtS1MP4EswQp9vi6FKo5wseuijCpNHS64BtMXS7zDYHHM/1xDuvejireMU9Od9bA/5Z2s1bPkq8Z5u18g3rP6mE6PqCtAb+ajijKrJ6hdEO7Tw5jD4xdQ/dWdYHMic5vCvY1EKzEeHqqLoG+pWh+9Qx0zV7uHHpZAGkrLPxG8leuy6H0BWtRG6ahjKHcRKp6FsphO8JK99i5ZlIdkijV4cIZyteQZy51SATd/rEZ32KMP2eZ5d3gHeVe9tEhX2d3FqZF3En/q2NtDVNtvlBaRoQgoA== X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: ab3231ee-0bea-457e-2ecd-08dbba34bc91 X-MS-Exchange-CrossTenant-AuthSource: PH0PR10MB5481.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Sep 2023 23:53:06.8975 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: E59s2raY3omlX4L4ij0Ra7khWPF04AaaXm2X0GGXWi+Vuc2wKGdGS4/H6bQnd+ImYOWYe9gt5hPJu7GTlOzivfugt/HAf4X3tdnzxCFiIsY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR10MB6480 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.601,FMLib:17.11.176.26 definitions=2023-09-20_12,2023-09-20_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 spamscore=0 malwarescore=0 adultscore=0 phishscore=0 bulkscore=0 mlxscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2308100000 definitions=main-2309200200 X-Proofpoint-ORIG-GUID: 0PbzrV7eNrozBio5WfOwzAWcCzczl8Hp X-Proofpoint-GUID: 0PbzrV7eNrozBio5WfOwzAWcCzczl8Hp Received-SPF: pass client-ip=205.220.177.32; envelope-from=william.roche@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: William Roche A memory page poisoned from the hypervisor level is no longer readable. Thus, it is now treated as a zero-page for the ram saving migration phase. The migration of a VM will crash Qemu when it tries to read the memory address space and stumbles on the poisoned page with a similar stack trace: Program terminated with signal SIGBUS, Bus error. #0 _mm256_loadu_si256 #1 buffer_zero_avx2 #2 select_accel_fn #3 buffer_is_zero #4 save_zero_page_to_file #5 save_zero_page #6 ram_save_target_page_legacy #7 ram_save_host_page #8 ram_find_and_save_block #9 ram_save_iterate #10 qemu_savevm_state_iterate #11 migration_iteration_run #12 migration_thread #13 qemu_thread_start Fix it by considering poisoned pages as if they were zero-pages for the migration copy. This fix also works with underlying large pages, taking into account the RAMBlock segment "page-size". Standard migration and compressed transfers are handled by this code. RDMA transfer isn't touched. Reviewed-by: Peter Xu Tested-by: Li Zhijian # RDMA Signed-off-by: William Roche --- accel/kvm/kvm-all.c | 14 ++++++++++++++ accel/stubs/kvm-stub.c | 5 +++++ include/sysemu/kvm.h | 10 ++++++++++ migration/ram-compress.c | 3 ++- migration/ram.c | 24 ++++++++++++++++++++++-- migration/ram.h | 2 ++ 6 files changed, 55 insertions(+), 3 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index ff1578bb32..7fb13c8a56 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -1152,6 +1152,20 @@ static void kvm_unpoison_all(void *param) } } +bool kvm_hwpoisoned_page(RAMBlock *block, void *offset) +{ + HWPoisonPage *pg; + ram_addr_t ram_addr = (ram_addr_t) offset; + + QLIST_FOREACH(pg, &hwpoison_page_list, list) { + if ((ram_addr >= pg->ram_addr) && + (ram_addr - pg->ram_addr < block->page_size)) { + return true; + } + } + return false; +} + void kvm_hwpoison_page_add(ram_addr_t ram_addr) { HWPoisonPage *page; diff --git a/accel/stubs/kvm-stub.c b/accel/stubs/kvm-stub.c index 235dc661bc..c0a31611df 100644 --- a/accel/stubs/kvm-stub.c +++ b/accel/stubs/kvm-stub.c @@ -133,3 +133,8 @@ uint32_t kvm_dirty_ring_size(void) { return 0; } + +bool kvm_hwpoisoned_page(RAMBlock *block, void *ram_addr) +{ + return false; +} diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index ee9025f8e9..858688227a 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -570,4 +570,14 @@ bool kvm_arch_cpu_check_are_resettable(void); bool kvm_dirty_ring_enabled(void); uint32_t kvm_dirty_ring_size(void); + +/** + * kvm_hwpoisoned_page - indicate if the given page is poisoned + * @block: memory block of the given page + * @ram_addr: offset of the page + * + * Returns: true: page is poisoned + * false: page not yet poisoned + */ +bool kvm_hwpoisoned_page(RAMBlock *block, void *ram_addr); #endif diff --git a/migration/ram-compress.c b/migration/ram-compress.c index 06254d8c69..1916ce709d 100644 --- a/migration/ram-compress.c +++ b/migration/ram-compress.c @@ -34,6 +34,7 @@ #include "qemu/error-report.h" #include "migration.h" #include "options.h" +#include "ram.h" #include "io/channel-null.h" #include "exec/target_page.h" #include "exec/ramblock.h" @@ -198,7 +199,7 @@ static CompressResult do_compress_ram_page(QEMUFile *f, z_stream *stream, assert(qemu_file_buffer_empty(f)); - if (buffer_is_zero(p, page_size)) { + if (migration_buffer_is_zero(block, offset, page_size)) { return RES_ZEROPAGE; } diff --git a/migration/ram.c b/migration/ram.c index 9040d66e61..21357666dc 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1129,6 +1129,26 @@ void ram_release_page(const char *rbname, uint64_t offset) ram_discard_range(rbname, offset, TARGET_PAGE_SIZE); } +/** + * migration_buffer_is_zero: indicate if the page at the given + * location is entirely filled with zero, or is a poisoned page. + * + * @block: block that contains the page + * @offset: offset inside the block for the page + * @len: size to consider + */ +bool migration_buffer_is_zero(RAMBlock *block, ram_addr_t offset, + size_t len) +{ + uint8_t *p = block->host + offset; + + if (kvm_enabled() && kvm_hwpoisoned_page(block, (void *)offset)) { + return true; + } + + return buffer_is_zero(p, len); +} + /** * save_zero_page_to_file: send the zero page to the file * @@ -1142,10 +1162,9 @@ void ram_release_page(const char *rbname, uint64_t offset) static int save_zero_page_to_file(PageSearchStatus *pss, QEMUFile *file, RAMBlock *block, ram_addr_t offset) { - uint8_t *p = block->host + offset; int len = 0; - if (buffer_is_zero(p, TARGET_PAGE_SIZE)) { + if (migration_buffer_is_zero(block, offset, TARGET_PAGE_SIZE)) { len += save_page_header(pss, file, block, offset | RAM_SAVE_FLAG_ZERO); qemu_put_byte(file, 0); len += 1; @@ -1182,6 +1201,7 @@ static int save_zero_page(PageSearchStatus *pss, QEMUFile *f, RAMBlock *block, * > 0 - number of pages written * * Return true if the pages has been saved, otherwise false is returned. + * TODO: hwpoison pages fail RDMA migration, should be handled. */ static bool control_save_page(PageSearchStatus *pss, RAMBlock *block, ram_addr_t offset, int *pages) diff --git a/migration/ram.h b/migration/ram.h index 145c915ca7..805ea2a211 100644 --- a/migration/ram.h +++ b/migration/ram.h @@ -65,6 +65,8 @@ void ram_handle_compressed(void *host, uint8_t ch, uint64_t size); void ram_transferred_add(uint64_t bytes); void ram_release_page(const char *rbname, uint64_t offset); +bool migration_buffer_is_zero(RAMBlock *block, ram_addr_t offset, size_t len); + int ramblock_recv_bitmap_test(RAMBlock *rb, void *host_addr); bool ramblock_recv_bitmap_test_byte_offset(RAMBlock *rb, uint64_t byte_offset); void ramblock_recv_bitmap_set(RAMBlock *rb, void *host_addr); From patchwork Fri Oct 13 15:08:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Roche X-Patchwork-Id: 1848339 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=oracle.com header.i=@oracle.com header.a=rsa-sha256 header.s=corp-2023-03-30 header.b=Gm2v5zdX; dkim=pass (1024-bit key; unprotected) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-oracle-onmicrosoft-com header.b=PWyJRZbW; dkim-atps=neutral Authentication-Results: legolas.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=patchwork.ozlabs.org) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4S6VL26HHXz1yqj for ; Sat, 14 Oct 2023 02:10:02 +1100 (AEDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qrJnI-00072U-K7; Fri, 13 Oct 2023 11:09:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qrJn9-0006zD-CW for qemu-devel@nongnu.org; Fri, 13 Oct 2023 11:09:33 -0400 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qrJn2-0006zo-ED for qemu-devel@nongnu.org; Fri, 13 Oct 2023 11:09:30 -0400 Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 39DE0nFC019270; Fri, 13 Oct 2023 15:09:21 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2023-03-30; bh=W2UWonwhJLUiL/DU8SA7D1JKPkE/ypyvs/ozde+ZdS8=; b=Gm2v5zdX3deSrxysrRD2/g+8/y5FD1awrJCyVAwSAis5mAZUJEsFe8XzW4nyXlPLOubX VCS7pcCRvfWrJr+j4N2AUlXQHyBtXiwuk7HWg0T+aAEfKgVMx9gtKntNpI34/Ibip0Pt eCmfWPiApPd2ZUdW30iWeDwCpBnhnfUJCa9CoIJ5/fcxs4v9COBZLJ45KgRbnEmnlp4N 6fiDnkvSkZlMc7TZeHsH6kMLSV+gQ3YGsTBEpM/JWQjQ1lawQNc6rTlPCdawvJwcIGtN P+bA9RxVTvAW4hyfmufqtyZhcWFhMRRY5FzFE1AxWr9Y+0z7NDnU52TUMSTS9O8NCzbd Ng== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3tmh912j3d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 13 Oct 2023 15:09:20 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 39DF8vME021322; Fri, 13 Oct 2023 15:09:00 GMT Received: from nam11-co1-obe.outbound.protection.outlook.com (mail-co1nam11lp2168.outbound.protection.outlook.com [104.47.56.168]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 3tptasfv4p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 13 Oct 2023 15:09:00 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KIrB11APN2mr0uKEMhT0KKandDhnsPD8XqkfstR7BPadeJGbFUBoMYyTmBa/SuAflya6Bb8kigfDSD3rCFM6tRJWYSKPBpQMRFOQqoTQUe3vvX5dEQ91StEt673wWI3sL2F3+O5B83X9FZFYlqaMFZIycIyTgkraoqtj12C2N0NKqkVs8i+IIMzP23Y8yilB5xY1tiFFECvYP3m55uyN0FpVuAaYeBEWDMJ6n0LOzKvwpy26IiU94rrLH0aATDniJJc1wYo+MRM9Es4ThjwLzKk0gc3XYJyoRHVve3ByMf4VJIwx1+wrJuBPMXBpAHKpGNZmxA8nOicbaZllQZkGwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=W2UWonwhJLUiL/DU8SA7D1JKPkE/ypyvs/ozde+ZdS8=; b=NnShCQeF3iLlsjafJAGPrwuW4rsTEbfHoASWpZor4PLFxChiMjP63HL84L2iKFxQJmPvVAsh7H2VGHd6OMRbA+BY6T08atDsTDfeGxuIQRxRhwl1a7SanRUWm5Sm4TBryvby3D4cq6LuVMqyGdjh6fVWIhw5RDVt2kJZeWS+rm4CFfoO3sKBT5b9zNuIJZsTX6Z+3YOypucI5wggmAWzW/SIoJ45caSRi/40eAapQsx6Drc7ux/tPa6rv89SmWkS87dQ7pyvKCEtKF09WvHhk6oSPrls9oWuhlKejhtTxUbVg04SishSxfy22R48KTlr/qlUazGSO3xhGJtmr1mJIg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=W2UWonwhJLUiL/DU8SA7D1JKPkE/ypyvs/ozde+ZdS8=; b=PWyJRZbW5cgqihWCqT4tGRCf4Xig1Q1tYQI+v/HGhPZIqxHpdXfabQG99N/rFe7OycAsBvUq+ZvRymtMz6QfPx5dsINnSphPxrHybEWDftEdbW8VNDjl6WpbaZV0GBWLrDlxAqMGUNoVKpEL23oOpCAVZDY9iMdzEYOBVDstsEE= Received: from PH0PR10MB5481.namprd10.prod.outlook.com (2603:10b6:510:ea::5) by CH2PR10MB4166.namprd10.prod.outlook.com (2603:10b6:610:78::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.37; Fri, 13 Oct 2023 15:08:58 +0000 Received: from PH0PR10MB5481.namprd10.prod.outlook.com ([fe80::487d:5c37:8928:9885]) by PH0PR10MB5481.namprd10.prod.outlook.com ([fe80::487d:5c37:8928:9885%4]) with mapi id 15.20.6863.043; Fri, 13 Oct 2023 15:08:58 +0000 From: =?utf-8?q?=E2=80=9CWilliam_Roche?= To: qemu-devel@nongnu.org, peterx@redhat.com Cc: lizhijian@fujitsu.com, pbonzini@redhat.com, quintela@redhat.com, leobras@redhat.com, joao.m.martins@oracle.com, lidongchen@tencent.com, william.roche@oracle.com Subject: [PATCH v4 2/2] migration: prevent migration when a poisoned page is unknown from the VM Date: Fri, 13 Oct 2023 15:08:39 +0000 Message-Id: <20231013150839.867164-3-william.roche@oracle.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20231013150839.867164-1-william.roche@oracle.com> References: <20230920235301.1622672-1-william.roche@oracle.com> <20231013150839.867164-1-william.roche@oracle.com> X-ClientProxiedBy: BL0PR0102CA0006.prod.exchangelabs.com (2603:10b6:207:18::19) To PH0PR10MB5481.namprd10.prod.outlook.com (2603:10b6:510:ea::5) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH0PR10MB5481:EE_|CH2PR10MB4166:EE_ X-MS-Office365-Filtering-Correlation-Id: b319961b-c0b2-4f93-8fd7-08dbcbfe52ff X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: yvUCcGURtAaGmPJj5876gcrk8JeKbzlG3mMkJQ5h5vvTWEB/nEoZTvQlQqGSZYpd84jTV1BNRgh7R4CSDCXIkypz+39CV0qqNT8B0jrp75mSFuiq3dx5sJtRZzPl9Wr+BY77x9A0xGztholH3H8uTa7droYiIA6nyINF4l5/sEX3c9cNx+fjNE8MQ+xaFuVUlJjg+qx77qxrlNSM7wkF5xM9TysJ1lkQue2yxpkAuFXUUndFWDGIbNw4V2o36R6vPUkACAs73Jz8gbD9Le/QgDe6MABb3U3xUySMLm53pgt6Nm8okIVReloawfY84zp6gyt97A3yGXBp83pdIhuV8UMFWoQIOtiXu2QbXuYBcE9BHfdaMWHALiG3Z2RMB/DQdhxVVZ1hWHTWVGmRmFmwHj+9eZdrvLXvqwu9HRGPiQLEZkyNVV1qtlC74aY/p6uDfLZJtsX3y0jX8XZpNs36NrgiYRC6dD7aATgtpkQ27rPWauN1CF2ErwAtTXK/ZIOb3LVboYJbe+x1Dd/q/tt6SooTKbP2TEMKv6bYEdfQ4fdZFBgjds79WM1KAe32Bcwe X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PH0PR10MB5481.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(39860400002)(366004)(136003)(396003)(376002)(346002)(230922051799003)(1800799009)(451199024)(186009)(64100799003)(86362001)(38100700002)(36756003)(5660300002)(41300700001)(66946007)(66476007)(6666004)(2906002)(8676002)(478600001)(8936002)(6486002)(6512007)(4326008)(6506007)(83380400001)(1076003)(2616005)(107886003)(66556008)(316002)(26005); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Gp4IMu+sEYRfudpcu+11K9Goqe7qbZpccDZnLb+AFXop2ZB1/QQ99pXVPAvJZdEZL4G7Zc/NBSRPois0iqrc/AhFdRifLZn9jKtzI3EPl6r7BWASBLyZ6fy3rbKywEfLSt/c/wM5eMSQRdXe0PkFlpSDF7VkEq2qcxy6rW97j6B7sWvOqmnU+Vaz1HO75B2SbEzGpz5YlNE8GBKSX49PG8CpL0IpQvEfl7RkqyQKkDuaE0tVZE1bnxWmslbOgDtXwV11Z1A381E8CR6EG9AiZmlrpIlgBNkqa/xyV1ImDu8Gx/nbuSzAXhw3hiclu32f24O31xAKpGjcAF7GU5Kd7I84DgtPl9oF7axgYCfoCj/S65peQxGTGzqbfJwAJZRem/CZ9dHUmTH7CrE7EG/LmKhink6gCJy4okTQL0zDygFPaxkWi+Efuy5vu6/iuODe9WWb03xf51qsCifmLRicobP9+zibedHP6KJ8CH9YfOPBZ/Q6AikF6qDtWPu8bI2ha47ZuW0MVU4aLt6D3zE/UhuI7OQNmNL3AFGCFpJ1RwIf2M69Q3j6WBhpVXA+sqbJiZmXBrlESFQtrq4K0hkwzQFOZXM/kAlDPovnZTtbBPUXYGKmBpmIFUR1jgXj+/J5aS1nAjNbsn16BjaOc/KGhi0hfiLv7YbFXcE4l1esSUcdLD6UZrDkIlf611yrJhs8aBRLypvzhkFMkWhQIPG7Qf8obEXaWQlA4DXkYx7t2BIjhP4Gbo6sEMbu0yVev1qN4pk7H6gtoHdr9QpIMxtz0Y4nZ7F/SN8QQ6GW/QMEvLG1kpMm/cagYGibkQ8iBV51cgLX1NLtPn2TGpfw1VZDnJ2I4r0sN1mYU/rR2ACXx6RpXNPy3P9CKGQkGCb4k0tfq/FyhJPAX3ogpQ8DKejXVW0UJXUbgkdsYDMZTIlfhSP26EAEVAW6wmX0bnwh8BoBP2fvAYEf2lAcnf6mlndpLsNdILG0CPuuEE+K4PjaXg9aROKH0vg/Gp40LPPkssXpXVYzKu42YdX6QqqUNjD3eveiZlkI51qzrNc1CRzWKHvmJXcpOEf/EQ0wiUv5OZQ43oOkjNh5Dr5BPzaOk5KSmKXM7Aa4j5DwrqFgbxhtoRiuG1rYIhE4dH8UbyX0HOJ1dqa91sCGa9ZrH1jwchZ4jpbGU6sR0csKYNiO6G3AW0Ep0sFgu4AfDWNpxm3q+bySVnKwmjAEQAsTw/B/47iH/S6sEkuLQ3iMAuz6JHZ1mTV/RdLTjDE2KdQVuWmdQApkSh25k/tqfEi5W3N7xuO/kjqC76YrYzxC9IdUHlQaASeeMfMT37WjEjenCu5il6g5O7EX4E/k0gxMQwCSqIi7m5a19aiQq33h3h2nE3q6mJ6i9Cnr2B0j288HzTcD4X3xh+JExrm7oHVNE24zSnXolCqCv4bXoL1UyIFf2yOEWezCYIsMLWlwo2Ic0jp5d9XicXTOdC+FMEAU2s9HQulIeaYjuSz1VfSSZbL04iMnZhJ0SGFcEZPmAooMJMogmhJL+XoQzs0l6ciR2NiapL9WGqcc+WVE4kISnk7Zaf9014MhGpQH5kn94v40p/vph87wEIDdgqhydx0/HBYPnswIgQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: FvYLj5EfMT9BrAUNEV2TtZ0T9lswHdMtl+Y1aNVE9kQT9zKyy4ekQYzFzTDZeqRPUmPppUjnuGy2X6ZIrTKbU+9Y2K+0Xg3utCbI9nJ8KgTfkEPufcyRxRRexoUySkBHTysfEtGwlJZGUrMq4/xpvuLIJzjex5YdT0x5EQkohaMIPt75gDh76vNnfkF/wn5orfQnNon/X1KhK4kMtZSaOESTjaG2j+HKyNB3CkZvAlrAIb8Hy/kF9fsKHclFqyRqz2kYxP1RwtDeiz0K77dm7e/O2E7U3xIL+p/tVfODUcwRjsZL1dwmwGaqi3BstxU3EKVlNr3cz1gbxV7AcfD2LC0ke6auzpqPBuzjR7/daCa5wiI8o+A3yQWPLpVI/FW/fva1Xw2ObMvmA+PuOVEx90IPGivfZNNs0bG/SU9D506QZXrCcm9c421iSOVGN7OD7OcL5oOr1OlaYCPmlRMr1avlHNzcHH9F2SSf/fuBOh4wV7N3zAxSf7K7oKmpUhOiF2SBRigO8JSFscQI4jZeG1vHimdMfxk3TY/wlXgXXUI/YsgxYtrKO17GuceQI+PT7qMmhN7r0AzjThWOzLA+HAzopW5P5htwdAuN1aIvtu/Pzw4P80Ms2MnM5ycEHtF3ii2PLyMlMvSmSCu5p1TYLGOTNF4FVHUrA+zF0ZtqWcqFl52mZOlsHm4QecXsJx8Vs3o/ZbFnUu1dFbVahs1y4diMuw7ancEWl9Ewdjg++PgoG0HvUp3g5Te1nr68CzGTs/RDZzXBA2oumtIArWwFk9NRtdM4E7RubxNTar4h6SKHMaJ8V3D/7Z56x7EhL6G/Etfg+tdlLZBZOrCqhNm3tQ== X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: b319961b-c0b2-4f93-8fd7-08dbcbfe52ff X-MS-Exchange-CrossTenant-AuthSource: PH0PR10MB5481.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2023 15:08:57.9081 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 3EXphpY9A69QmJlSbwnzioZ5+i9e5Ybj9Q/gwl+qmpO4ny5ElUH5tT1F9KaSOd3gKiF2H/9f0Xk7jXDDYGBXxQQAcz8uBPC90BiG0nyK4eQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR10MB4166 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.272,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-10-13_06,2023-10-12_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 bulkscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2309180000 definitions=main-2310130128 X-Proofpoint-GUID: gDOL9R2c_BemUkTAtmt4v0KpeGVB8iSC X-Proofpoint-ORIG-GUID: gDOL9R2c_BemUkTAtmt4v0KpeGVB8iSC Received-SPF: pass client-ip=205.220.165.32; envelope-from=william.roche@oracle.com; helo=mx0a-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=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.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: William Roche Migrating a poisoned page as a zero-page can only be done when the running guest kernel knows about this poison, so that it marks this page as unaccessible and any access in the VM would fail. But if a poison information is not relayed to the VM, the kernel does not prevent its access. In this case, transforming a poisoned page into a zero-page could create a case of silent data corruption. So we have to keep track of poisons not injected into the guest, like the ARM VM emulation ignoring BUS_MCEERR_AO errors. When such a page exists, the migration has to be blocked. Signed-off-by: William Roche --- accel/kvm/kvm-all.c | 27 ++++++++++++++++++++++++++- accel/stubs/kvm-stub.c | 5 +++++ include/sysemu/kvm.h | 6 ++++++ include/sysemu/kvm_int.h | 3 ++- migration/migration.c | 6 ++++++ target/arm/kvm64.c | 6 +++++- target/i386/kvm/kvm.c | 2 +- 7 files changed, 51 insertions(+), 4 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 850577ea0e..2829b6372a 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -1133,8 +1133,17 @@ int kvm_vm_check_extension(KVMState *s, unsigned int extension) return ret; } +/* + * We track the poisoned pages to be able to: + * - replace them on VM reset + * - skip them when migrating + * - block a migration for a VM where a poisoned page is ignored + * as this VM kernel (not knowing about the error) could + * incorrectly access the page. + */ typedef struct HWPoisonPage { ram_addr_t ram_addr; + bool vm_known; QLIST_ENTRY(HWPoisonPage) list; } HWPoisonPage; @@ -1166,20 +1175,36 @@ bool kvm_hwpoisoned_page(RAMBlock *block, void *offset) return false; } -void kvm_hwpoison_page_add(ram_addr_t ram_addr) +void kvm_hwpoison_page_add(ram_addr_t ram_addr, bool known) { HWPoisonPage *page; QLIST_FOREACH(page, &hwpoison_page_list, list) { if (page->ram_addr == ram_addr) { + if (known && !page->vm_known) { + page->vm_known = true; + } return; } } page = g_new(HWPoisonPage, 1); page->ram_addr = ram_addr; + page->vm_known = known; QLIST_INSERT_HEAD(&hwpoison_page_list, page, list); } +bool kvm_hwpoisoned_unknown(void) +{ + HWPoisonPage *pg; + + QLIST_FOREACH(pg, &hwpoison_page_list, list) { + if (!pg->vm_known) { + return true; + } + } + return false; +} + static uint32_t adjust_ioeventfd_endianness(uint32_t val, uint32_t size) { #if HOST_BIG_ENDIAN != TARGET_BIG_ENDIAN diff --git a/accel/stubs/kvm-stub.c b/accel/stubs/kvm-stub.c index c0a31611df..c43de44263 100644 --- a/accel/stubs/kvm-stub.c +++ b/accel/stubs/kvm-stub.c @@ -138,3 +138,8 @@ bool kvm_hwpoisoned_page(RAMBlock *block, void *ram_addr) { return false; } + +bool kvm_hwpoisoned_unknown(void) +{ + return false; +} diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index 858688227a..37c8316ce4 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -580,4 +580,10 @@ uint32_t kvm_dirty_ring_size(void); * false: page not yet poisoned */ bool kvm_hwpoisoned_page(RAMBlock *block, void *ram_addr); + +/** + * kvm_hwpoisoned_unknown - indicate if a qemu reported memory error + * is still unknown to (hasn't been injected into) the VM kernel. + */ +bool kvm_hwpoisoned_unknown(void); #endif diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h index a5b9122cb8..2dfde40690 100644 --- a/include/sysemu/kvm_int.h +++ b/include/sysemu/kvm_int.h @@ -136,10 +136,11 @@ void kvm_set_max_memslot_size(hwaddr max_slot_size); * * Parameters: * @ram_addr: the address in the RAM for the poisoned page + * @known: indicate if the error is injected to the VM kernel * * Add a poisoned page to the list * * Return: None. */ -void kvm_hwpoison_page_add(ram_addr_t ram_addr); +void kvm_hwpoison_page_add(ram_addr_t ram_addr, bool known); #endif diff --git a/migration/migration.c b/migration/migration.c index 1c6c81ad49..27e9571aaf 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -66,6 +66,7 @@ #include "sysemu/qtest.h" #include "options.h" #include "sysemu/dirtylimit.h" +#include "sysemu/kvm.h" static NotifierList migration_state_notifiers = NOTIFIER_LIST_INITIALIZER(migration_state_notifiers); @@ -1646,6 +1647,11 @@ static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc, return false; } + if (kvm_hwpoisoned_unknown()) { + error_setg(errp, "Can't migrate this vm with ignored poisoned page"); + return false; + } + if (migration_is_blocked(errp)) { return false; } diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c index 5e95c496bb..e8db6380c1 100644 --- a/target/arm/kvm64.c +++ b/target/arm/kvm64.c @@ -1158,7 +1158,6 @@ void kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr) ram_addr = qemu_ram_addr_from_host(addr); if (ram_addr != RAM_ADDR_INVALID && kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) { - kvm_hwpoison_page_add(ram_addr); /* * If this is a BUS_MCEERR_AR, we know we have been called * synchronously from the vCPU thread, so we can easily @@ -1169,7 +1168,12 @@ void kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr) * called synchronously from the vCPU thread, or a bit * later from the main thread, so doing the injection of * the error would be more complicated. + * In this case, BUS_MCEERR_AO errors are unknown from the + * guest, and we will prevent migration as long as this + * poisoned page hasn't generated a BUS_MCEERR_AR error + * that the guest takes into account. */ + kvm_hwpoison_page_add(ram_addr, (code == BUS_MCEERR_AR)); if (code == BUS_MCEERR_AR) { kvm_cpu_synchronize_state(c); if (!acpi_ghes_record_errors(ACPI_HEST_SRC_ID_SEA, paddr)) { diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index f6c7f7e268..f9365b4457 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -649,7 +649,7 @@ void kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr) ram_addr = qemu_ram_addr_from_host(addr); if (ram_addr != RAM_ADDR_INVALID && kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) { - kvm_hwpoison_page_add(ram_addr); + kvm_hwpoison_page_add(ram_addr, true); kvm_mce_inject(cpu, paddr, code); /*