From patchwork Sun Mar 24 17:28:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: fei X-Patchwork-Id: 1063324 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) 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=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=126.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=126.com header.i=@126.com header.b="CrzhgWa/"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44S4BB5M8Gz9sRk for ; Mon, 25 Mar 2019 04:28:50 +1100 (AEDT) Received: from localhost ([127.0.0.1]:58818 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h86vO-000718-Rd for incoming@patchwork.ozlabs.org; Sun, 24 Mar 2019 13:28:46 -0400 Received: from eggs.gnu.org ([209.51.188.92]:45724) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h86up-0006zd-1o for qemu-devel@nongnu.org; Sun, 24 Mar 2019 13:28:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h86uo-0003Zd-0H for qemu-devel@nongnu.org; Sun, 24 Mar 2019 13:28:11 -0400 Received: from m15-112.126.com ([220.181.15.112]:58441) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h86un-0003Z3-CJ for qemu-devel@nongnu.org; Sun, 24 Mar 2019 13:28:09 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; s=s110527; h=From:Subject:Date:Message-Id; bh=2+qSQRDo4aiMtKLt5s NZXmaEGxRSwV/xxleKhYu03iE=; b=CrzhgWa/gLxzd8qHi//T6KMTISxMD63yQN JUhctgaqcn2SPO9R56n3jDvQhXdhI68qgo16/pyzctQlPGbQ61FzF0mU+7Rgil6i S/ceydNzMK6+2qZPXRPVZpKWDk8RV7MPnACIE4S+TKjPpp8BcetoO3bPRLhiZ3S3 YW3b2woAg= Received: from localhost.localdomain (unknown [1.202.123.222]) by smtp2 (Coremail) with SMTP id DMmowACnj2QkvpdcZ9avCA--.55457S2; Mon, 25 Mar 2019 01:28:04 +0800 (CST) From: Fei Li To: qemu-devel@nongnu.org Date: Mon, 25 Mar 2019 01:28:03 +0800 Message-Id: <20190324172803.3810-1-lifei1214@126.com> X-Mailer: git-send-email 2.17.2 (Apple Git-113) X-CM-TRANSID: DMmowACnj2QkvpdcZ9avCA--.55457S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxXw1DXry5Kr4fCr4DWryrXrb_yoW5XF4Upr WUJ34UurW8CFy3AF93J3WkCr1Sqw1FqF4UKay5tw13u3WUWa9IyFy2ya45WFW8CF1UXF47 CrZ0kry0ga1jqw7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07bwmhwUUUUU= X-Originating-IP: [1.202.123.222] X-CM-SenderInfo: 5olivxarsrkqqrswhudrp/1tbiaAWBIVpD8K4N-gAAs5 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 220.181.15.112 Subject: [Qemu-devel] [PATCH v12 for-4.1 11/11] qemu_thread: supplement error handling for touch_all_pages X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: lifei1214@126.com, Fei Li , Markus Armbruster Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Fei Li Supplement the error handling for touch_all_pages: add an Error parameter for it to propagate the error to its caller to do the handling in case it fails. Cc: Markus Armbruster Signed-off-by: Fei Li --- util/oslib-posix.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/util/oslib-posix.c b/util/oslib-posix.c index eb849997cc..2131e68dab 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -447,12 +447,12 @@ static inline int get_memset_num_threads(int smp_cpus) } static bool touch_all_pages(char *area, size_t hpagesize, size_t numpages, - int smp_cpus) + int smp_cpus, Error **errp) { size_t numpages_per_thread; size_t size_per_thread; char *addr = area; - int i = 0; + int i = 0, j = 0; memset_thread_failed = false; memset_num_threads = get_memset_num_threads(smp_cpus); @@ -464,20 +464,32 @@ static bool touch_all_pages(char *area, size_t hpagesize, size_t numpages, memset_thread[i].numpages = (i == (memset_num_threads - 1)) ? numpages : numpages_per_thread; memset_thread[i].hpagesize = hpagesize; - /* TODO: let the callers handle the error instead of abort() here */ - qemu_thread_create(&memset_thread[i].pgthread, "touch_pages", - do_touch_pages, &memset_thread[i], - QEMU_THREAD_JOINABLE, &error_abort); + if (qemu_thread_create(&memset_thread[i].pgthread, "touch_pages", + do_touch_pages, &memset_thread[i], + QEMU_THREAD_JOINABLE, errp) < 0) { + break; + } addr += size_per_thread; numpages -= numpages_per_thread; } - for (i = 0; i < memset_num_threads; i++) { - qemu_thread_join(&memset_thread[i].pgthread); + + for (j = 0; j < i; j++) { + qemu_thread_join(&memset_thread[j].pgthread); } g_free(memset_thread); memset_thread = NULL; - return memset_thread_failed; + if (i < memset_num_threads) { + /* qemu_thread_create() has set @errp */ + return false; + } + + if (memset_thread_failed) { + error_setg(errp, "os_mem_prealloc: Insufficient free host " + "memory pages available to allocate guest RAM"); + return false; + } + return true; } void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus, @@ -500,10 +512,7 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus, } /* touch pages simultaneously */ - if (touch_all_pages(area, hpagesize, numpages, smp_cpus)) { - error_setg(errp, "os_mem_prealloc: Insufficient free host memory " - "pages available to allocate guest RAM"); - } + touch_all_pages(area, hpagesize, numpages, smp_cpus, errp); ret = sigaction(SIGBUS, &oldact, NULL); if (ret) {