static bool ufd_check_and_apply(int ufd, MigrationIncomingState *mis) { uint64_t asked_features = 0; static uint64_t supported_features; /* * it's not possible to * request UFFD_API twice per one fd * userfault fd features is persistent */ if (!supported_features) { if (!receive_ufd_features(&supported_features)) { error_report("%s failed", __func__); return false; } } #ifdef UFFD_FEATURE_THREAD_ID if (migrate_postcopy_blocktime() && mis && UFFD_FEATURE_THREAD_ID & supported_features) { /* kernel supports that feature */ /* don't create blocktime_context if it exists */ if (!mis->blocktime_ctx) { mis->blocktime_ctx = blocktime_context_new(); } asked_features |= UFFD_FEATURE_THREAD_ID; } #endif /* * request features, even if asked_features is 0, due to * kernel expects UFFD_API before UFFDIO_REGISTER, per * userfault file descriptor */ if (!request_ufd_features(ufd, asked_features)) { error_report("%s failed: features %" PRIu64, __func__, asked_features); return false; } if (getpagesize() != ram_pagesize_summary()) { bool have_hp = false; /* We've got a huge page */ #ifdef UFFD_FEATURE_MISSING_HUGETLBFS have_hp = supported_features & UFFD_FEATURE_MISSING_HUGETLBFS; #endif if (!have_hp) { error_report("Userfault on this host does not support huge pages"); return false; } } return true; }
static bool ufd_check_and_apply(int ufd, MigrationIncomingState *mis) { uint64_t asked_features = 0; static uint64_t supported_features; /* * it's not possible to * request UFFD_API twice per one fd * userfault fd features is persistent */ if (!supported_features) { if (!receive_ufd_features(&supported_features)) { error_report("%s failed", __func__); return false; } } /* * request features, even if asked_features is 0, due to * kernel expects UFFD_API before UFFDIO_REGISTER, per * userfault file descriptor */ if (!request_ufd_features(ufd, asked_features)) { error_report("%s failed: features %" PRIu64, __func__, asked_features); return false; } if (getpagesize() != ram_pagesize_summary()) { bool have_hp = false; /* We've got a huge page */ #ifdef UFFD_FEATURE_MISSING_HUGETLBFS have_hp = supported_features & UFFD_FEATURE_MISSING_HUGETLBFS; #endif if (!have_hp) { error_report("Userfault on this host does not support huge pages"); return false; } } return true; }