Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp3644606ybg; Fri, 25 Oct 2019 07:03:07 -0700 (PDT) X-Google-Smtp-Source: APXvYqzkBwn26PbqLcEhZ85h2N3h8l4JZ+PSL4j6vnjEx9Yc2BQZMXaE46Q9NaiLn38uGRVPii+u X-Received: by 2002:adf:f342:: with SMTP id e2mr3395306wrp.61.1572012187715; Fri, 25 Oct 2019 07:03:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572012187; cv=none; d=google.com; s=arc-20160816; b=zkv2CDj30jES7SFRcnZpJcWpKIWi3yTHCaWB8P6FGr5FsAWUS/shlPyM6U+r2p8C31 gbbyotYRz+WpizwX8b6WtdMFnr3CZ1epGcl2ku2OoYlIFePS2eazG33Cf5OAa0/wBhfv lY03rUDzsa27Hyq2SItdNcTp0YovTUlmF7EQXPnR1xqlMlWa0PLUXsj9eJ4n9jbvgepw mMqvBXbPQqqpSGmsfH6krF7mPfXS/qv41KLuqN7itUzJ03d9jFyClGp1nBM6q6YwDbtD p0HLd0P8BgRviqPHKh1/NGUTAvh/MfzaO1oYbI2zam9Y/nAYB320nI/aNpKgYoDgBuGf 4fOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=0mp4UnfMmFBuAFZUwVWAjKo0HN743MLM5cwfxhfpVk0=; b=XQCcXAnUMX1MxYSsMj+8XhQMNAWouM3cB/i56vtTOnvqicSzW2ts4NdIz0Mw06wN+u 1euh4DjZVmsYipTPEnf69N+uUNXTiDy0zxzy8t8YrQwvet9DPVoQmBYgiizw0qVU/hjl pd3w6X+Cw8Jh2vOMhWi80k7z4/Obwd0V8nmX0NYe4Lp/2O0tkxS6SYNS8ikoPBrdJGAQ dDJcAjd4qcV6c2ZjyPJ8OSC0c1naJVeZkwNXOXfczVtaxpnF1xXhTR+hCzblcB/crVDj 9Q6nyiEL1ohcTE5yZaOxZRU+A/MfL9p0gTnPkofa1itgQig85f6uxQXwpypvoh66T7JM ldOg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@aepfle.de header.s=strato-dkim-0002 header.b=Nw1GQz9j; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g6si1507634edf.256.2019.10.25.07.02.23; Fri, 25 Oct 2019 07:03:07 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@aepfle.de header.s=strato-dkim-0002 header.b=Nw1GQz9j; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2409536AbfJXOxU (ORCPT + 99 others); Thu, 24 Oct 2019 10:53:20 -0400 Received: from mo4-p00-ob.smtp.rzone.de ([81.169.146.218]:33798 "EHLO mo4-p00-ob.smtp.rzone.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2409522AbfJXOxU (ORCPT ); Thu, 24 Oct 2019 10:53:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1571928798; s=strato-dkim-0002; d=aepfle.de; h=Message-Id:Date:Subject:Cc:To:From:X-RZG-CLASS-ID:X-RZG-AUTH:From: Subject:Sender; bh=0mp4UnfMmFBuAFZUwVWAjKo0HN743MLM5cwfxhfpVk0=; b=Nw1GQz9jiGSQNi7TAYWR/0CCpMMHrmYhxmQU73QOYACcGXLJMNX7tPevrIjR1OWxvY S5IA2By8AOpBD32oqnrPbU+nvOFl49lcGjlFmiFjt1o0vKfT8ikdoQdPGB2K+VS6JIFh SpUzxbzN8mFb0qjdQ4g0sU8gMp8R88uS86YDIUH9pGDWn22OPfVeoBmgOCLv6r9yqO4P obOpc0VTWZB/Ldp2hqbBEJXceDOPPB8QKhdIWz+JJW3CgMTV4E6bfgcWL00I+yeU3P4m 2+CCEiP5yR5ApO84NJp6c3ox3+0G5Phr5WRkbdQm4WTspYkhX4VjqsvklJDKGON2aDrn m8Yg== X-RZG-AUTH: ":P2EQZWCpfu+qG7CngxMFH1J+3q8wa/QXkBR9MXjAuz7MdiQehTvc3KJf+T+odQ==" X-RZG-CLASS-ID: mo00 Received: from sender by smtp.strato.de (RZmta 44.28.1 DYNA|AUTH) with ESMTPSA id e01a77v9OEoBcWQ (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate); Thu, 24 Oct 2019 16:50:11 +0200 (CEST) From: Olaf Hering To: "K. Y. Srinivasan" , Haiyang Zhang , Stephen Hemminger , Sasha Levin , linux-hyperv@vger.kernel.org (open list:Hyper-V CORE AND DRIVERS), linux-kernel@vger.kernel.org (open list) Cc: Olaf Hering Subject: [PATCH v1] tools/hv: async name resolution in kvp_daemon Date: Thu, 24 Oct 2019 16:49:43 +0200 Message-Id: <20191024144943.26199-1-olaf@aepfle.de> X-Mailer: git-send-email 2.16.4 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The hostname is resolved just once since commit 58125210ab3b ("Tools: hv: cache FQDN in kvp_daemon to avoid timeouts") to make sure the VM responds within the timeout limits to requests from the host. If for some reason getaddrinfo fails, the string returned by the "FullyQualifiedDomainName" request contains some error string, which is then used by tools on the host side. Adjust the code to resolve the current hostname in a separate thread. This thread loops until getaddrinfo returns success. During this time all "FullyQualifiedDomainName" requests will be answered with an empty string. Signed-off-by: Olaf Hering --- tools/hv/Makefile | 2 ++ tools/hv/hv_kvp_daemon.c | 69 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 48 insertions(+), 23 deletions(-) diff --git a/tools/hv/Makefile b/tools/hv/Makefile index b57143d9459c..3b5481015a84 100644 --- a/tools/hv/Makefile +++ b/tools/hv/Makefile @@ -22,6 +22,8 @@ ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS)) ALL_SCRIPTS := hv_get_dhcp_info.sh hv_get_dns_info.sh hv_set_ifconfig.sh +$(OUTPUT)hv_kvp_daemon: LDFLAGS += -lpthread + all: $(ALL_PROGRAMS) export srctree OUTPUT CC LD CFLAGS diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c index e9ef4ca6a655..22cf1c4dbf5c 100644 --- a/tools/hv/hv_kvp_daemon.c +++ b/tools/hv/hv_kvp_daemon.c @@ -41,6 +41,7 @@ #include #include #include +#include /* * KVP protocol: The user mode component first registers with the @@ -85,7 +86,7 @@ static char *processor_arch; static char *os_build; static char *os_version; static char *lic_version = "Unknown version"; -static char full_domain_name[HV_KVP_EXCHANGE_MAX_VALUE_SIZE]; +static char *full_domain_name; static struct utsname uts_buf; /* @@ -1327,27 +1328,53 @@ static int kvp_set_ip_info(char *if_name, struct hv_kvp_ipaddr_value *new_val) return error; } - -static void -kvp_get_domain_name(char *buffer, int length) +/* + * Async retrival of Fully Qualified Domain Name because getaddrinfo takes an + * unpredictable amount of time to finish. + */ +static void *kvp_getaddrinfo(void *p) { - struct addrinfo hints, *info ; - int error = 0; + char *tmp, **str_ptr = (char **)p; + char hostname[HOST_NAME_MAX + 1]; + struct addrinfo *info, hints = { + .ai_family = AF_INET, /* Get only ipv4 addrinfo. */ + .ai_socktype = SOCK_STREAM, + .ai_flags = AI_CANONNAME, + }; + int ret; + + if (gethostname(hostname, sizeof(hostname) - 1) < 0) + goto out; + + do { + ret = getaddrinfo(hostname, NULL, &hints, &info); + if (ret) + sleep(1); + } while (ret); + + ret = asprintf(&tmp, "%s", info->ai_canonname); + freeaddrinfo(info); + if (ret <= 0) + goto out; + + if (ret > HV_KVP_EXCHANGE_MAX_VALUE_SIZE) + tmp[HV_KVP_EXCHANGE_MAX_VALUE_SIZE - 1] = '\0'; + *str_ptr = tmp; - gethostname(buffer, length); - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_INET; /*Get only ipv4 addrinfo. */ - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_CANONNAME; +out: + pthread_exit(NULL); +} + +static void kvp_obtain_domain_name(char **str_ptr) +{ + pthread_t t; - error = getaddrinfo(buffer, NULL, &hints, &info); - if (error != 0) { - snprintf(buffer, length, "getaddrinfo failed: 0x%x %s", - error, gai_strerror(error)); + if (pthread_create(&t, NULL, kvp_getaddrinfo, str_ptr)) { + syslog(LOG_ERR, "pthread_create failed; error: %d %s", + errno, strerror(errno)); return; } - snprintf(buffer, length, "%s", info->ai_canonname); - freeaddrinfo(info); + pthread_detach(t); } void print_usage(char *argv[]) @@ -1412,11 +1439,7 @@ int main(int argc, char *argv[]) * Retrieve OS release information. */ kvp_get_os_info(); - /* - * Cache Fully Qualified Domain Name because getaddrinfo takes an - * unpredictable amount of time to finish. - */ - kvp_get_domain_name(full_domain_name, sizeof(full_domain_name)); + kvp_obtain_domain_name(&full_domain_name); if (kvp_file_init()) { syslog(LOG_ERR, "Failed to initialize the pools"); @@ -1571,7 +1594,7 @@ int main(int argc, char *argv[]) switch (hv_msg->body.kvp_enum_data.index) { case FullyQualifiedDomainName: - strcpy(key_value, full_domain_name); + strcpy(key_value, full_domain_name ? : ""); strcpy(key_name, "FullyQualifiedDomainName"); break; case IntegrationServicesVersion: