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 1196EC54E94 for ; Wed, 25 Jan 2023 22:40:52 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pKoRf-0003ZD-06; Wed, 25 Jan 2023 17:40:45 -0500 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 1pKoRT-0003XW-5P for qemu-devel@nongnu.org; Wed, 25 Jan 2023 17:40:32 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pKoRQ-0003TD-4Y for qemu-devel@nongnu.org; Wed, 25 Jan 2023 17:40:30 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1674686427; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mgWAmFhO1SluaiXTDo0rWNJI4Io+ZQddb6XYbVbf1uw=; b=ci9VsBkBOEu+sCOZBpX/tmbYa1jyNoEU7DELv1szFfc/MJ0kraaw0NxJ6xzSmuRhi4mjGX 9OCB+MpEVFj/f8uyAWhxFfholaPqo+jqEvhOzPu1p39NDr3ZmYMJoiYjqUSKsIoe3IpaLg +NEDC/n2u83b2gjzf61Dx03XDjC3ocA= Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-671-7YBcqEWDMkmmQ4E-sqn8wg-1; Wed, 25 Jan 2023 17:40:23 -0500 X-MC-Unique: 7YBcqEWDMkmmQ4E-sqn8wg-1 Received: by mail-qv1-f71.google.com with SMTP id lv8-20020a056214578800b0053477624294so54708qvb.22 for ; Wed, 25 Jan 2023 14:40:23 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mgWAmFhO1SluaiXTDo0rWNJI4Io+ZQddb6XYbVbf1uw=; b=VY27tG3s2UijYAflfDERHTwLcb403CGNeN7b6lwK+Rcrxfy+D4PQZI7LQ+qdt0mk8j Kbg1ZurPF8BjiRx3LAp9tuNku4B+QxEfrX8GuxZ9pVHIEOSeECXLCjchveWTf1mma6Tl GSmCKnhofnkF4r+wJnYMexVh/gH0fCiopwSZcKv6zolK9/GPE1GZDhNqyWEblT8rhZ42 G4q29aCtKYd4m0op70BdA9yMKHMjwDrU/UIW+SLRmtSJrZwTHkzcnGPwZT2TxeSu3qxx zTaaFXqq/oQ/0HaM4K1uk3zuxsCtPE5Iz46uDC/VBCls/zS2b4MSRbfsfRyySxFR51A5 VwJg== X-Gm-Message-State: AFqh2krfnXDQo5VomLz9ZOpaV8HvWzw4RWtPXNUErXIdqbIyh2btSlK2 K6UztJ+M7/Q3WdoE+Hhgecj24pQJs+ctlL7puOX1yCFx9m1Emw6j2vldr9MS0OsRTg8OKQ0dv68 KVsacwoH9Pn9rQ3ASI7AOVq7Gk7TqUanqoupzeFofYy7hCSPRT2ppHjnnD0d0xGZ7 X-Received: by 2002:ac8:1346:0:b0:3b2:1003:37e5 with SMTP id f6-20020ac81346000000b003b2100337e5mr51892622qtj.55.1674686422112; Wed, 25 Jan 2023 14:40:22 -0800 (PST) X-Google-Smtp-Source: AMrXdXvP0x4x6kOmf04Q7dXI89R0bVha3CmInUBG417ZLkHNpLeQGcgjbJC0cP9x12Jcg/f7oqO/LA== X-Received: by 2002:ac8:1346:0:b0:3b2:1003:37e5 with SMTP id f6-20020ac81346000000b003b2100337e5mr51892587qtj.55.1674686421703; Wed, 25 Jan 2023 14:40:21 -0800 (PST) Received: from x1n.redhat.com (bras-base-aurron9127w-grc-56-70-30-145-63.dsl.bell.ca. [70.30.145.63]) by smtp.gmail.com with ESMTPSA id z10-20020ac8430a000000b003b6325dfc4esm4133279qtm.67.2023.01.25.14.40.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Jan 2023 14:40:21 -0800 (PST) From: Peter Xu To: qemu-devel@nongnu.org Cc: Leonardo Bras Soares Passos , peterx@redhat.com, "Dr . David Alan Gilbert" , Juan Quintela Subject: [PATCH 2/3] util/userfaultfd: Add uffd_open() Date: Wed, 25 Jan 2023 17:40:15 -0500 Message-Id: <20230125224016.212529-3-peterx@redhat.com> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20230125224016.212529-1-peterx@redhat.com> References: <20230125224016.212529-1-peterx@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=170.10.129.124; envelope-from=peterx@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_H2=-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+qemu-devel=archiver.kernel.org@nongnu.org Sender: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Add a helper to create the uffd handle. Signed-off-by: Peter Xu --- include/qemu/userfaultfd.h | 1 + migration/postcopy-ram.c | 11 +++++------ tests/qtest/migration-test.c | 3 ++- util/userfaultfd.c | 13 +++++++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/include/qemu/userfaultfd.h b/include/qemu/userfaultfd.h index 6b74f92792..a19a05d5f7 100644 --- a/include/qemu/userfaultfd.h +++ b/include/qemu/userfaultfd.h @@ -17,6 +17,7 @@ #include "exec/hwaddr.h" #include +int uffd_open(int flags); int uffd_query_features(uint64_t *features); int uffd_create_fd(uint64_t features, bool non_blocking); void uffd_close_fd(int uffd_fd); diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c index b9a37ef255..0c55df0e52 100644 --- a/migration/postcopy-ram.c +++ b/migration/postcopy-ram.c @@ -37,6 +37,7 @@ #include "qemu-file.h" #include "yank_functions.h" #include "tls.h" +#include "qemu/userfaultfd.h" /* Arbitrary limit on size of each discard command, * keeps them around ~200 bytes @@ -226,11 +227,9 @@ static bool receive_ufd_features(uint64_t *features) int ufd; bool ret = true; - /* if we are here __NR_userfaultfd should exists */ - ufd = syscall(__NR_userfaultfd, O_CLOEXEC); + ufd = uffd_open(O_CLOEXEC); if (ufd == -1) { - error_report("%s: syscall __NR_userfaultfd failed: %s", __func__, - strerror(errno)); + error_report("%s: uffd_open() failed: %s", __func__, strerror(errno)); return false; } @@ -375,7 +374,7 @@ bool postcopy_ram_supported_by_host(MigrationIncomingState *mis) goto out; } - ufd = syscall(__NR_userfaultfd, O_CLOEXEC); + ufd = uffd_open(O_CLOEXEC); if (ufd == -1) { error_report("%s: userfaultfd not available: %s", __func__, strerror(errno)); @@ -1160,7 +1159,7 @@ static int postcopy_temp_pages_setup(MigrationIncomingState *mis) int postcopy_ram_incoming_setup(MigrationIncomingState *mis) { /* Open the fd for the kernel to give us userfaults */ - mis->userfault_fd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK); + mis->userfault_fd = uffd_open(O_CLOEXEC | O_NONBLOCK); if (mis->userfault_fd == -1) { error_report("%s: Failed to open userfault fd: %s", __func__, strerror(errno)); diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c index 1dd32c9506..7a5d1922dd 100644 --- a/tests/qtest/migration-test.c +++ b/tests/qtest/migration-test.c @@ -62,13 +62,14 @@ static bool uffd_feature_thread_id; #include #include #include +#include "qemu/userfaultfd.h" static bool ufd_version_check(void) { struct uffdio_api api_struct; uint64_t ioctl_mask; - int ufd = syscall(__NR_userfaultfd, O_CLOEXEC); + int ufd = uffd_open(O_CLOEXEC); if (ufd == -1) { g_test_message("Skipping test: userfaultfd not available"); diff --git a/util/userfaultfd.c b/util/userfaultfd.c index f1cd6af2b1..9845a2ec81 100644 --- a/util/userfaultfd.c +++ b/util/userfaultfd.c @@ -19,6 +19,15 @@ #include #include +int uffd_open(int flags) +{ +#if defined(__linux__) && defined(__NR_userfaultfd) + return syscall(__NR_userfaultfd, flags); +#else + return -EINVAL; +#endif +} + /** * uffd_query_features: query UFFD features * @@ -32,7 +41,7 @@ int uffd_query_features(uint64_t *features) struct uffdio_api api_struct = { 0 }; int ret = -1; - uffd_fd = syscall(__NR_userfaultfd, O_CLOEXEC); + uffd_fd = uffd_open(O_CLOEXEC); if (uffd_fd < 0) { trace_uffd_query_features_nosys(errno); return -1; @@ -69,7 +78,7 @@ int uffd_create_fd(uint64_t features, bool non_blocking) uint64_t ioctl_mask = BIT(_UFFDIO_REGISTER) | BIT(_UFFDIO_UNREGISTER); flags = O_CLOEXEC | (non_blocking ? O_NONBLOCK : 0); - uffd_fd = syscall(__NR_userfaultfd, flags); + uffd_fd = uffd_open(flags); if (uffd_fd < 0) { trace_uffd_create_fd_nosys(errno); return -1; -- 2.37.3