From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org 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 smtp.lore.kernel.org (Postfix) with ESMTPS id D97AACCF9FE for ; Fri, 31 Oct 2025 13:18:53 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vEp0v-0000Od-4o; Fri, 31 Oct 2025 09:18:05 -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 1vEp0n-0000No-A4 for qemu-arm@nongnu.org; Fri, 31 Oct 2025 09:17:53 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEp0a-0003lj-HI for qemu-arm@nongnu.org; Fri, 31 Oct 2025 09:17:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1761916649; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k4nZN04g0fpHzGnnakyzUEsMbyKPI2T16hrZiR3jQVA=; b=Fb2JMMBP4t3NWJB4W397DIz+KECJl2zNjLLOa8uE30cN6ZFiDzrGTmwdsyS9mJ7XqLXiaB fx6vC1aJb3uC1CwVbLo15vwjVn5tWrRptYBRxZFfp0lWcHku/40FxroTrK63t8HxM67vRC sAbY6DbgckD6gkGP2LvbCo/GUr1vnn8= Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-624-cElr8r-kNT2QvjhVuliI5g-1; Fri, 31 Oct 2025 09:17:25 -0400 X-MC-Unique: cElr8r-kNT2QvjhVuliI5g-1 X-Mimecast-MFC-AGG-ID: cElr8r-kNT2QvjhVuliI5g_1761916645 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-476b8c02445so19592385e9.1 for ; Fri, 31 Oct 2025 06:17:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761916644; x=1762521444; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:subject:cc:to:from:date:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=k4nZN04g0fpHzGnnakyzUEsMbyKPI2T16hrZiR3jQVA=; b=tx2wHf9SyksBE130hkqZJHTeSLov6vh/3611G/6nkkxz0WTYvN0s5oj4C5zfxkVL6i 7zTM1ezzZOEhbSJM1JfzcEqQd2wtx5jb5HY0MeiAqtPGiXmsEczs2LhvDf4XxQlHcX9Q rswVnOzksUKZEnAuwKx9ojXXZokeB2w9IW2PWYr0+mMDwgobkC6k7G6yVMKiFeYlakhQ F2OYHcy0UmnsOwyk6PzEm01tgbR3mnl1zAFkj/yiWN7NlJo8/eZOlgeAp5swCz8mHKYE 8dd8zxsL0ZQA570dxaNrlY0o52j6vdJIbF0z/jY4OT0RuO5UC5uojbAbus2Elwcyg7Pu uPOQ== X-Gm-Message-State: AOJu0YxHPR40AF5VeM02ihMUd7HK61EXGAKIvg93gWvVTHQcFCviF/kB dVQKEoRTGdHSND7beRnSOPl2x6wt0I7oz1txT2r5lleHA+J6zIK+9gzfaUC8GsL0DuIbMlqCFa3 nXAUWK9r/eET1invLhHg/XH7WwlE27Xyg2waXgSWaCJ635Sk7wNzp5Q== X-Gm-Gg: ASbGncszS2BluSgXdER8cscV+kzXi8mbh0Bao1lwl4cgwhMwIKlUz3MX8fwb5aiihEG fi/y1tBVLzWXtD3fDimg1XRkmxFRbzFDPuOacr0/J1HWVa+UrL+NDN0wCFBDYbdroiJVtkLK0lL B2eWkTeIqWvBHQdkfcRGdBdJd5fWUfJhy5XZM1MRFiiGE9hXO3nQgzp5wUUGMMKi5q8So92pLLa DzELjBIo43n3pKk0huvAgRjXuiLjYF2s2qEmpT+CzzfEwf6ncCnWR5ELciN0TEtuALVkFoF2njs M1uF7EQtoYSKtjxJucNHqjm884bz565S+uBCYujxnChOXKEzhm3SNPqbhGfa212T5A== X-Received: by 2002:a05:600c:828f:b0:46e:3d41:6001 with SMTP id 5b1f17b1804b1-477308a7b5emr40871095e9.34.1761916644493; Fri, 31 Oct 2025 06:17:24 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHsY3ncpfw8eiQh4KIaiJCPOMuF2F81dtFS+n1DSrptFNRtWHjcGxfDnmVPK0rRJeGLJsxTQQ== X-Received: by 2002:a05:600c:828f:b0:46e:3d41:6001 with SMTP id 5b1f17b1804b1-477308a7b5emr40870635e9.34.1761916644052; Fri, 31 Oct 2025 06:17:24 -0700 (PDT) Received: from fedora ([85.93.96.130]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4772ff83182sm21996875e9.4.2025.10.31.06.17.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Oct 2025 06:17:23 -0700 (PDT) Date: Fri, 31 Oct 2025 14:17:21 +0100 From: Igor Mammedov To: Gavin Shan Cc: qemu-arm@nongnu.org, qemu-devel@nongnu.org, mst@redhat.com, anisinha@redhat.com, gengdongjiu1@gmail.com, peter.maydell@linaro.org, pbonzini@redhat.com, mchehab+huawei@kernel.org, Jonathan.Cameron@huawei.com, shan.gavin@gmail.com Subject: Re: [PATCH RESEND v2 1/3] acpi/ghes: Extend acpi_ghes_memory_errors() to support multiple CPERs Message-ID: <20251031141721.4d336189@fedora> In-Reply-To: <20251007060810.258536-2-gshan@redhat.com> References: <20251007060810.258536-1-gshan@redhat.com> <20251007060810.258536-2-gshan@redhat.com> X-Mailer: Claws Mail 4.3.1 (GTK 3.24.49; x86_64-redhat-linux-gnu) MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: yHSJaHYUvhx6MClHr9QNVwUoC0fAYI6_V_0vdNVAMRc_1761916645 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Received-SPF: pass client-ip=170.10.133.124; envelope-from=imammedo@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-arm@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-arm-bounces+qemu-arm=archiver.kernel.org@nongnu.org Sender: qemu-arm-bounces+qemu-arm=archiver.kernel.org@nongnu.org On Tue, 7 Oct 2025 16:08:08 +1000 Gavin Shan wrote: > In the situation where host and guest has 64KB and 4KB page sizes, one > error on the host's page affects 16 guest's pages. we need to send 16 > consective errors in this specific case. > > Extend acpi_ghes_memory_errors() to support multiple CPERs after the > hunk of code to generate the GHES error status is pulled out from > ghes_gen_err_data_uncorrectable_recoverable(). > > No functional changes intended. > > Signed-off-by: Gavin Shan > --- > hw/acpi/ghes-stub.c | 2 +- > hw/acpi/ghes.c | 27 ++++++++++++++------------- > include/hw/acpi/ghes.h | 2 +- > target/arm/kvm.c | 7 ++++++- > 4 files changed, 22 insertions(+), 16 deletions(-) > > diff --git a/hw/acpi/ghes-stub.c b/hw/acpi/ghes-stub.c > index 40f660c246..c1f8c9bec9 100644 > --- a/hw/acpi/ghes-stub.c > +++ b/hw/acpi/ghes-stub.c > @@ -12,7 +12,7 @@ > #include "hw/acpi/ghes.h" > > int acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > - uint64_t physical_address) > + GArray *addresses) > { > return -1; > } > diff --git a/hw/acpi/ghes.c b/hw/acpi/ghes.c > index 06555905ce..045b77715f 100644 > --- a/hw/acpi/ghes.c > +++ b/hw/acpi/ghes.c > @@ -214,18 +214,13 @@ static void acpi_ghes_build_append_mem_cper(GArray *table, > > static void > ghes_gen_err_data_uncorrectable_recoverable(GArray *block, > - const uint8_t *section_type, > - int data_length) > + const uint8_t *section_type) > { > /* invalid fru id: ACPI 4.0: 17.3.2.6.1 Generic Error Data, > * Table 17-13 Generic Error Data Entry > */ > QemuUUID fru_id = {}; > > - /* Build the new generic error status block header */ > - acpi_ghes_generic_error_status(block, ACPI_GEBS_UNCORRECTABLE, > - 0, 0, data_length, ACPI_CPER_SEV_RECOVERABLE); > - > /* Build this new generic error data entry header */ > acpi_ghes_generic_error_data(block, section_type, > ACPI_CPER_SEV_RECOVERABLE, 0, 0, > @@ -557,19 +552,20 @@ void ghes_record_cper_errors(AcpiGhesState *ags, const void *cper, size_t len, > } > > int acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > - uint64_t physical_address) > + GArray *addresses) > { > /* Memory Error Section Type */ > const uint8_t guid[] = > UUID_LE(0xA5BC1114, 0x6F64, 0x4EDE, 0xB8, 0x63, 0x3E, 0x83, \ > 0xED, 0x7C, 0x83, 0xB1); > Error *errp = NULL; > - int data_length; > + int data_length, i; > GArray *block; > > block = g_array_new(false, true /* clear */, 1); > > - data_length = ACPI_GHES_DATA_LENGTH + ACPI_GHES_MEM_CPER_LENGTH; > + data_length = addresses->len * > + (ACPI_GHES_DATA_LENGTH + ACPI_GHES_MEM_CPER_LENGTH); > /* > * It should not run out of the preallocated memory if adding a new generic > * error data entry > @@ -577,10 +573,15 @@ int acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > assert((data_length + ACPI_GHES_GESB_SIZE) <= > ACPI_GHES_MAX_RAW_DATA_LENGTH); > > - ghes_gen_err_data_uncorrectable_recoverable(block, guid, data_length); > - > - /* Build the memory section CPER for above new generic error data entry */ > - acpi_ghes_build_append_mem_cper(block, physical_address); > + /* Build the new generic error status block header */ > + acpi_ghes_generic_error_status(block, ACPI_GEBS_UNCORRECTABLE, 0, 0, ^^^^^ with following loop, it might be no enough. See ACPI6.5 Tables 18.11: Status field Don't we need to set multiple_foo bit(s) and also fix 'Error Data Entry Count' bits? > + data_length, ACPI_CPER_SEV_RECOVERABLE); > + for (i = 0; i < addresses->len; i++) { > + ghes_gen_err_data_uncorrectable_recoverable(block, guid); > + /* Memory section CPER on top of the generic error data entry */ > + acpi_ghes_build_append_mem_cper(block, > + g_array_index(addresses, uint64_t, i)); > + } > > /* Report the error */ > ghes_record_cper_errors(ags, block->data, block->len, source_id, &errp); > diff --git a/include/hw/acpi/ghes.h b/include/hw/acpi/ghes.h > index df2ecbf6e4..a8cbc520d5 100644 > --- a/include/hw/acpi/ghes.h > +++ b/include/hw/acpi/ghes.h > @@ -99,7 +99,7 @@ void acpi_build_hest(AcpiGhesState *ags, GArray *table_data, > void acpi_ghes_add_fw_cfg(AcpiGhesState *vms, FWCfgState *s, > GArray *hardware_errors); > int acpi_ghes_memory_errors(AcpiGhesState *ags, uint16_t source_id, > - uint64_t error_physical_addr); > + GArray *addresses); > void ghes_record_cper_errors(AcpiGhesState *ags, const void *cper, size_t len, > uint16_t source_id, Error **errp); > > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index 4f769d69b3..9a47ac9e3a 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -2434,6 +2434,7 @@ void kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr) > ram_addr_t ram_addr; > hwaddr paddr; > AcpiGhesState *ags; > + GArray *addresses; > > assert(code == BUS_MCEERR_AR || code == BUS_MCEERR_AO); > > @@ -2442,6 +2443,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)) { > + addresses = g_array_new(false, false, sizeof(paddr)); > kvm_hwpoison_page_add(ram_addr); > /* > * If this is a BUS_MCEERR_AR, we know we have been called > @@ -2454,16 +2456,19 @@ void kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr) > * later from the main thread, so doing the injection of > * the error would be more complicated. > */ > + g_array_append_vals(addresses, &paddr, 1); > if (code == BUS_MCEERR_AR) { > kvm_cpu_synchronize_state(c); > if (!acpi_ghes_memory_errors(ags, ACPI_HEST_SRC_ID_SYNC, > - paddr)) { > + addresses)) { > kvm_inject_arm_sea(c); > } else { > error_report("failed to record the error"); > abort(); > } > } > + > + g_array_free(addresses, true); > return; > } > if (code == BUS_MCEERR_AO) {