Blame 0001-Revert-ucx-check-supported-transports-and-devices-fo.patch

Honggang Li c03243
From 63c80c7692e55f634cbca6f67cc5c9cdef3a04d2 Mon Sep 17 00:00:00 2001
Honggang Li c03243
From: Honggang Li <honli@redhat.com>
Honggang Li c03243
Date: Mon, 28 Jun 2021 21:38:13 +0800
Honggang Li c03243
Subject: [PATCH] Revert "ucx: check supported transports and devices for
Honggang Li c03243
 setting priority"
Honggang Li c03243
Honggang Li c03243
This reverts commit c36d7459b6331c4da825cad5a64326e7c1a272aa.
Honggang Li c03243
---
Honggang Li c03243
 contrib/platform/mellanox/optimized.conf |   2 -
Honggang Li c03243
 ompi/mca/pml/ucx/pml_ucx_component.c     |  15 +-
Honggang Li c03243
 opal/mca/common/ucx/common_ucx.c         | 202 +----------------------
Honggang Li c03243
 opal/mca/common/ucx/common_ucx.h         |  15 --
Honggang Li c03243
 opal/mca/common/ucx/configure.m4         |   2 -
Honggang Li c03243
 5 files changed, 2 insertions(+), 234 deletions(-)
Honggang Li c03243
Honggang Li c03243
diff --git a/contrib/platform/mellanox/optimized.conf b/contrib/platform/mellanox/optimized.conf
Honggang Li c03243
index 543fd8d1e224..b86b37c9e2fa 100644
Honggang Li c03243
--- a/contrib/platform/mellanox/optimized.conf
Honggang Li c03243
+++ b/contrib/platform/mellanox/optimized.conf
Honggang Li c03243
@@ -61,8 +61,6 @@
Honggang Li c03243
 coll = ^ml
Honggang Li c03243
 hwloc_base_binding_policy = core
Honggang Li c03243
 btl = self
Honggang Li c03243
-pml_ucx_tls = any
Honggang Li c03243
-pml_ucx_devices = any
Honggang Li c03243
 # Basic behavior to smooth startup
Honggang Li c03243
 mca_base_component_show_load_errors = 0
Honggang Li c03243
 orte_abort_timeout = 10
Honggang Li c03243
diff --git a/ompi/mca/pml/ucx/pml_ucx_component.c b/ompi/mca/pml/ucx/pml_ucx_component.c
Honggang Li c03243
index 6aed6c41d11d..ed9cc6573e8e 100644
Honggang Li c03243
--- a/ompi/mca/pml/ucx/pml_ucx_component.c
Honggang Li c03243
+++ b/ompi/mca/pml/ucx/pml_ucx_component.c
Honggang Li c03243
@@ -107,26 +107,13 @@ static mca_pml_base_module_t*
Honggang Li c03243
 mca_pml_ucx_component_init(int* priority, bool enable_progress_threads,
Honggang Li c03243
                            bool enable_mpi_threads)
Honggang Li c03243
 {
Honggang Li c03243
-    opal_common_ucx_support_level_t support_level;
Honggang Li c03243
     int ret;
Honggang Li c03243
 
Honggang Li c03243
-    support_level = opal_common_ucx_support_level(ompi_pml_ucx.ucp_context);
Honggang Li c03243
-    if (support_level == OPAL_COMMON_UCX_SUPPORT_NONE) {
Honggang Li c03243
-        return NULL;
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
     if ( (ret = mca_pml_ucx_init(enable_mpi_threads)) != 0) {
Honggang Li c03243
         return NULL;
Honggang Li c03243
     }
Honggang Li c03243
 
Honggang Li c03243
-    /*
Honggang Li c03243
-     * If found supported devices - set to the configured (high) priority.
Honggang Li c03243
-     * Otherwise - Found only supported transports (which could be exposed by
Honggang Li c03243
-     *             unsupported devices), so set a priority lower than ob1.
Honggang Li c03243
-     */
Honggang Li c03243
-    *priority = (support_level == OPAL_COMMON_UCX_SUPPORT_DEVICE) ?
Honggang Li c03243
-                ompi_pml_ucx.priority : 19;
Honggang Li c03243
-    PML_UCX_VERBOSE(2, "returning priority %d", *priority);
Honggang Li c03243
+    *priority = ompi_pml_ucx.priority;
Honggang Li c03243
     return &ompi_pml_ucx.super;
Honggang Li c03243
 }
Honggang Li c03243
 
Honggang Li c03243
diff --git a/opal/mca/common/ucx/common_ucx.c b/opal/mca/common/ucx/common_ucx.c
Honggang Li c03243
index ac7a17d799a5..ae8e66877ab6 100644
Honggang Li c03243
--- a/opal/mca/common/ucx/common_ucx.c
Honggang Li c03243
+++ b/opal/mca/common/ucx/common_ucx.c
Honggang Li c03243
@@ -14,11 +14,8 @@
Honggang Li c03243
 #include "opal/mca/base/mca_base_framework.h"
Honggang Li c03243
 #include "opal/mca/pmix/pmix.h"
Honggang Li c03243
 #include "opal/memoryhooks/memory.h"
Honggang Li c03243
-#include "opal/util/argv.h"
Honggang Li c03243
 
Honggang Li c03243
 #include <ucm/api/ucm.h>
Honggang Li c03243
-#include <fnmatch.h>
Honggang Li c03243
-#include <stdio.h>
Honggang Li c03243
 
Honggang Li c03243
 /***********************************************************************/
Honggang Li c03243
 
Honggang Li c03243
@@ -28,8 +25,7 @@ opal_common_ucx_module_t opal_common_ucx = {
Honggang Li c03243
     .verbose             = 0,
Honggang Li c03243
     .progress_iterations = 100,
Honggang Li c03243
     .registered          = 0,
Honggang Li c03243
-    .opal_mem_hooks      = 0,
Honggang Li c03243
-    .tls                 = NULL
Honggang Li c03243
+    .opal_mem_hooks      = 0
Honggang Li c03243
 };
Honggang Li c03243
 
Honggang Li c03243
 static void opal_common_ucx_mem_release_cb(void *buf, size_t length,
Honggang Li c03243
@@ -40,15 +36,10 @@ static void opal_common_ucx_mem_release_cb(void *buf, size_t length,
Honggang Li c03243
 
Honggang Li c03243
 OPAL_DECLSPEC void opal_common_ucx_mca_var_register(const mca_base_component_t *component)
Honggang Li c03243
 {
Honggang Li c03243
-    static const char *default_tls     = "rc_verbs,ud_verbs,rc_mlx5,dc_mlx5,cuda_ipc,rocm_ipc";
Honggang Li c03243
-    static const char *default_devices = "mlx*";
Honggang Li c03243
     static int registered = 0;
Honggang Li c03243
     static int hook_index;
Honggang Li c03243
     static int verbose_index;
Honggang Li c03243
     static int progress_index;
Honggang Li c03243
-    static int tls_index;
Honggang Li c03243
-    static int devices_index;
Honggang Li c03243
-
Honggang Li c03243
     if (!registered) {
Honggang Li c03243
         verbose_index = mca_base_var_register("opal", "opal_common", "ucx", "verbose",
Honggang Li c03243
                                               "Verbose level of the UCX components",
Honggang Li c03243
@@ -69,29 +60,6 @@ OPAL_DECLSPEC void opal_common_ucx_mca_var_register(const mca_base_component_t *
Honggang Li c03243
                                            OPAL_INFO_LVL_3,
Honggang Li c03243
                                            MCA_BASE_VAR_SCOPE_LOCAL,
Honggang Li c03243
                                            &opal_common_ucx.opal_mem_hooks);
Honggang Li c03243
-
Honggang Li c03243
-        opal_common_ucx.tls  = malloc(sizeof(*opal_common_ucx.tls));
Honggang Li c03243
-        *opal_common_ucx.tls = strdup(default_tls);
Honggang Li c03243
-        tls_index = mca_base_var_register("opal", "opal_common", "ucx", "tls",
Honggang Li c03243
-                                          "List of UCX transports which should be supported on the system, to enable "
Honggang Li c03243
-                                          "selecting the UCX component. Special values: any (any available). "
Honggang Li c03243
-                                          "A '^' prefix negates the list. "
Honggang Li c03243
-                                          "For example, in order to exclude on shared memory and TCP transports, "
Honggang Li c03243
-                                          "please set to '^posix,sysv,self,tcp,cma,knem,xpmem'.",
Honggang Li c03243
-                                          MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
Honggang Li c03243
-                                          OPAL_INFO_LVL_3,
Honggang Li c03243
-                                          MCA_BASE_VAR_SCOPE_LOCAL,
Honggang Li c03243
-                                          opal_common_ucx.tls);
Honggang Li c03243
-
Honggang Li c03243
-        opal_common_ucx.devices  = malloc(sizeof(*opal_common_ucx.devices));
Honggang Li c03243
-        *opal_common_ucx.devices = strdup(default_devices);
Honggang Li c03243
-        devices_index = mca_base_var_register("opal", "opal_common", "ucx", "devices",
Honggang Li c03243
-                                              "List of device driver pattern names, which, if supported by UCX, will "
Honggang Li c03243
-                                              "bump its priority above ob1. Special values: any (any available)",
Honggang Li c03243
-                                              MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,
Honggang Li c03243
-                                              OPAL_INFO_LVL_3,
Honggang Li c03243
-                                              MCA_BASE_VAR_SCOPE_LOCAL,
Honggang Li c03243
-                                              opal_common_ucx.devices);
Honggang Li c03243
         registered = 1;
Honggang Li c03243
     }
Honggang Li c03243
     if (component) {
Honggang Li c03243
@@ -107,14 +75,6 @@ OPAL_DECLSPEC void opal_common_ucx_mca_var_register(const mca_base_component_t *
Honggang Li c03243
                                       component->mca_type_name,
Honggang Li c03243
                                       component->mca_component_name,
Honggang Li c03243
                                       "opal_mem_hooks", 0);
Honggang Li c03243
-        mca_base_var_register_synonym(tls_index, component->mca_project_name,
Honggang Li c03243
-                                      component->mca_type_name,
Honggang Li c03243
-                                      component->mca_component_name,
Honggang Li c03243
-                                      "tls", 0);
Honggang Li c03243
-        mca_base_var_register_synonym(devices_index, component->mca_project_name,
Honggang Li c03243
-                                      component->mca_type_name,
Honggang Li c03243
-                                      component->mca_component_name,
Honggang Li c03243
-                                      "devices", 0);
Honggang Li c03243
     }
Honggang Li c03243
 }
Honggang Li c03243
 
Honggang Li c03243
@@ -163,166 +123,6 @@ OPAL_DECLSPEC void opal_common_ucx_mca_deregister(void)
Honggang Li c03243
     opal_output_close(opal_common_ucx.output);
Honggang Li c03243
 }
Honggang Li c03243
 
Honggang Li c03243
-#if HAVE_DECL_OPEN_MEMSTREAM
Honggang Li c03243
-static bool opal_common_ucx_check_device(const char *device_name, char **device_list)
Honggang Li c03243
-{
Honggang Li c03243
-    char sysfs_driver_link[PATH_MAX];
Honggang Li c03243
-    char driver_path[PATH_MAX];
Honggang Li c03243
-    char *ib_device_name;
Honggang Li c03243
-    char *driver_name;
Honggang Li c03243
-    char **list_item;
Honggang Li c03243
-    ssize_t ret;
Honggang Li c03243
-
Honggang Li c03243
-    /* mlx5_0:1 */
Honggang Li c03243
-    ret = sscanf(device_name, "%m[^:]%*d", &ib_device_name);
Honggang Li c03243
-    if (ret != 1) {
Honggang Li c03243
-        return false;
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
-    sysfs_driver_link[sizeof(sysfs_driver_link) - 1] = '\0';
Honggang Li c03243
-    snprintf(sysfs_driver_link, sizeof(sysfs_driver_link) - 1,
Honggang Li c03243
-             "/sys/class/infiniband/%s/device/driver", ib_device_name);
Honggang Li c03243
-    free(ib_device_name);
Honggang Li c03243
-
Honggang Li c03243
-    driver_path[sizeof(driver_path) - 1] = '\0';
Honggang Li c03243
-    ret = readlink(sysfs_driver_link, driver_path, sizeof(driver_path) - 1);
Honggang Li c03243
-    if (ret < 0) {
Honggang Li c03243
-        MCA_COMMON_UCX_VERBOSE(2, "readlink(%s) failed: %s", sysfs_driver_link,
Honggang Li c03243
-                               strerror(errno));
Honggang Li c03243
-        return false;
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
-    driver_name = basename(driver_path);
Honggang Li c03243
-    for (list_item = device_list; *list_item != NULL; ++list_item) {
Honggang Li c03243
-        if (!fnmatch(*list_item, driver_name, 0)) {
Honggang Li c03243
-            MCA_COMMON_UCX_VERBOSE(2, "driver '%s' matched by '%s'",
Honggang Li c03243
-                                   driver_path, *list_item);
Honggang Li c03243
-            return true;
Honggang Li c03243
-        }
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
-    return false;
Honggang Li c03243
-}
Honggang Li c03243
-#endif
Honggang Li c03243
-
Honggang Li c03243
-OPAL_DECLSPEC opal_common_ucx_support_level_t
Honggang Li c03243
-opal_common_ucx_support_level(ucp_context_h context)
Honggang Li c03243
-{
Honggang Li c03243
-    opal_common_ucx_support_level_t support_level = OPAL_COMMON_UCX_SUPPORT_NONE;
Honggang Li c03243
-    static const char *support_level_names[] = {
Honggang Li c03243
-        [OPAL_COMMON_UCX_SUPPORT_NONE]      = "none",
Honggang Li c03243
-        [OPAL_COMMON_UCX_SUPPORT_TRANSPORT] = "transports only",
Honggang Li c03243
-        [OPAL_COMMON_UCX_SUPPORT_DEVICE]    = "transports and devices"
Honggang Li c03243
-    };
Honggang Li c03243
-#if HAVE_DECL_OPEN_MEMSTREAM
Honggang Li c03243
-    char *rsc_tl_name, *rsc_device_name;
Honggang Li c03243
-    char **tl_list, **device_list, **list_item;
Honggang Li c03243
-    bool is_any_tl, is_any_device;
Honggang Li c03243
-    bool found_tl, negate;
Honggang Li c03243
-    char line[128];
Honggang Li c03243
-    FILE *stream;
Honggang Li c03243
-    char *buffer;
Honggang Li c03243
-    size_t size;
Honggang Li c03243
-    int ret;
Honggang Li c03243
-#endif
Honggang Li c03243
-
Honggang Li c03243
-    is_any_tl     = !strcmp(*opal_common_ucx.tls, "any");
Honggang Li c03243
-    is_any_device = !strcmp(*opal_common_ucx.devices, "any");
Honggang Li c03243
-
Honggang Li c03243
-    /* Check for special value "any" */
Honggang Li c03243
-    if (is_any_tl && is_any_device) {
Honggang Li c03243
-        MCA_COMMON_UCX_VERBOSE(1, "ucx is enabled on any transport or device",
Honggang Li c03243
-                               *opal_common_ucx.tls);
Honggang Li c03243
-        support_level = OPAL_COMMON_UCX_SUPPORT_DEVICE;
Honggang Li c03243
-        goto out;
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
-#if HAVE_DECL_OPEN_MEMSTREAM
Honggang Li c03243
-    /* Split transports list */
Honggang Li c03243
-    negate  = ('^' == (*opal_common_ucx.tls)[0]);
Honggang Li c03243
-    tl_list = opal_argv_split(*opal_common_ucx.tls + (negate ? 1 : 0), ',');
Honggang Li c03243
-    if (tl_list == NULL) {
Honggang Li c03243
-        MCA_COMMON_UCX_VERBOSE(1, "failed to split tl list '%s', ucx is disabled",
Honggang Li c03243
-                               *opal_common_ucx.tls);
Honggang Li c03243
-        goto out;
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
-    /* Split devices list */
Honggang Li c03243
-    device_list = opal_argv_split(*opal_common_ucx.devices, ',');
Honggang Li c03243
-    if (device_list == NULL) {
Honggang Li c03243
-        MCA_COMMON_UCX_VERBOSE(1, "failed to split devices list '%s', ucx is disabled",
Honggang Li c03243
-                               *opal_common_ucx.devices);
Honggang Li c03243
-        goto out_free_tl_list;
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
-    /* Open memory stream to dump UCX information to */
Honggang Li c03243
-    stream = open_memstream(&buffer, &size);
Honggang Li c03243
-    if (stream == NULL) {
Honggang Li c03243
-        MCA_COMMON_UCX_VERBOSE(1, "failed to open memory stream for ucx info (%s), "
Honggang Li c03243
-                               "ucx is disabled", strerror(errno));
Honggang Li c03243
-        goto out_free_device_list;
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
-    /* Print ucx transports information to the memory stream */
Honggang Li c03243
-    ucp_context_print_info(context, stream);
Honggang Li c03243
-
Honggang Li c03243
-    /* Rewind and read transports/devices list from the stream */
Honggang Li c03243
-    fseek(stream, 0, SEEK_SET);
Honggang Li c03243
-    while ((support_level != OPAL_COMMON_UCX_SUPPORT_DEVICE) &&
Honggang Li c03243
-           (fgets(line, sizeof(line), stream) != NULL)) {
Honggang Li c03243
-        rsc_tl_name = NULL;
Honggang Li c03243
-        ret = sscanf(line,
Honggang Li c03243
-                     /* "# resource 6  :  md 5  dev 4  flags -- rc_verbs/mlx5_0:1" */
Honggang Li c03243
-                     "# resource %*d : md %*d dev %*d flags -- %m[^/ \n\r]/%m[^/ \n\r]",
Honggang Li c03243
-                     &rsc_tl_name, &rsc_device_name);
Honggang Li c03243
-        if (ret != 2) {
Honggang Li c03243
-            free(rsc_tl_name);
Honggang Li c03243
-            continue;
Honggang Li c03243
-        }
Honggang Li c03243
-
Honggang Li c03243
-        /* Check if 'rsc_tl_name' is found  provided list */
Honggang Li c03243
-        found_tl = is_any_tl;
Honggang Li c03243
-        for (list_item = tl_list; !found_tl && (*list_item != NULL); ++list_item) {
Honggang Li c03243
-            found_tl = !strcmp(*list_item, rsc_tl_name);
Honggang Li c03243
-        }
Honggang Li c03243
-
Honggang Li c03243
-        /* Check if the transport has a match (either positive or negative) */
Honggang Li c03243
-        assert(!(is_any_tl && negate));
Honggang Li c03243
-        if (found_tl != negate) {
Honggang Li c03243
-            if (is_any_device ||
Honggang Li c03243
-                opal_common_ucx_check_device(rsc_device_name, device_list)) {
Honggang Li c03243
-                MCA_COMMON_UCX_VERBOSE(2, "%s/%s: matched both transport and device list",
Honggang Li c03243
-                                    rsc_tl_name, rsc_device_name);
Honggang Li c03243
-                support_level = OPAL_COMMON_UCX_SUPPORT_DEVICE;
Honggang Li c03243
-            } else {
Honggang Li c03243
-                MCA_COMMON_UCX_VERBOSE(2, "%s/%s: matched transport list but not device list",
Honggang Li c03243
-                                    rsc_tl_name, rsc_device_name);
Honggang Li c03243
-                support_level = OPAL_COMMON_UCX_SUPPORT_TRANSPORT;
Honggang Li c03243
-            }
Honggang Li c03243
-        } else {
Honggang Li c03243
-            MCA_COMMON_UCX_VERBOSE(2, "%s/%s: did not match transport list",
Honggang Li c03243
-                                   rsc_tl_name, rsc_device_name);
Honggang Li c03243
-        }
Honggang Li c03243
-
Honggang Li c03243
-        free(rsc_device_name);
Honggang Li c03243
-        free(rsc_tl_name);
Honggang Li c03243
-    }
Honggang Li c03243
-
Honggang Li c03243
-    MCA_COMMON_UCX_VERBOSE(2, "support level is %s", support_level_names[support_level]);
Honggang Li c03243
-    fclose(stream);
Honggang Li c03243
-    free(buffer);
Honggang Li c03243
-
Honggang Li c03243
-out_free_device_list:
Honggang Li c03243
-    opal_argv_free(device_list);
Honggang Li c03243
-out_free_tl_list:
Honggang Li c03243
-    opal_argv_free(tl_list);
Honggang Li c03243
-out:
Honggang Li c03243
-#else
Honggang Li c03243
-    MCA_COMMON_UCX_VERBOSE(2, "open_memstream() was not found, ucx is disabled");
Honggang Li c03243
-#endif
Honggang Li c03243
-    return support_level;
Honggang Li c03243
-}
Honggang Li c03243
-
Honggang Li c03243
 void opal_common_ucx_empty_complete_cb(void *request, ucs_status_t status)
Honggang Li c03243
 {
Honggang Li c03243
 }
Honggang Li c03243
diff --git a/opal/mca/common/ucx/common_ucx.h b/opal/mca/common/ucx/common_ucx.h
Honggang Li c03243
index 92cdd738ef98..202131ac8907 100644
Honggang Li c03243
--- a/opal/mca/common/ucx/common_ucx.h
Honggang Li c03243
+++ b/opal/mca/common/ucx/common_ucx.h
Honggang Li c03243
@@ -88,8 +88,6 @@ typedef struct opal_common_ucx_module {
Honggang Li c03243
     int  progress_iterations;
Honggang Li c03243
     int  registered;
Honggang Li c03243
     bool opal_mem_hooks;
Honggang Li c03243
-    char **tls;
Honggang Li c03243
-    char **devices;
Honggang Li c03243
 } opal_common_ucx_module_t;
Honggang Li c03243
 
Honggang Li c03243
 typedef struct opal_common_ucx_del_proc {
Honggang Li c03243
@@ -97,23 +95,10 @@ typedef struct opal_common_ucx_del_proc {
Honggang Li c03243
     size_t   vpid;
Honggang Li c03243
 } opal_common_ucx_del_proc_t;
Honggang Li c03243
 
Honggang Li c03243
-typedef enum {
Honggang Li c03243
-    /* No supported transports found (according to configured list of supported
Honggang Li c03243
-       transports) */
Honggang Li c03243
-    OPAL_COMMON_UCX_SUPPORT_NONE,
Honggang Li c03243
-
Honggang Li c03243
-    /* Have supported transports but not supported devices */
Honggang Li c03243
-    OPAL_COMMON_UCX_SUPPORT_TRANSPORT,
Honggang Li c03243
-
Honggang Li c03243
-    /* Have both supported transports and supported devices */
Honggang Li c03243
-    OPAL_COMMON_UCX_SUPPORT_DEVICE,
Honggang Li c03243
-} opal_common_ucx_support_level_t;
Honggang Li c03243
-
Honggang Li c03243
 extern opal_common_ucx_module_t opal_common_ucx;
Honggang Li c03243
 
Honggang Li c03243
 OPAL_DECLSPEC void opal_common_ucx_mca_register(void);
Honggang Li c03243
 OPAL_DECLSPEC void opal_common_ucx_mca_deregister(void);
Honggang Li c03243
-OPAL_DECLSPEC opal_common_ucx_support_level_t opal_common_ucx_support_level(ucp_context_h context);
Honggang Li c03243
 OPAL_DECLSPEC void opal_common_ucx_mca_proc_added(void);
Honggang Li c03243
 OPAL_DECLSPEC void opal_common_ucx_empty_complete_cb(void *request, ucs_status_t status);
Honggang Li c03243
 OPAL_DECLSPEC int opal_common_ucx_mca_pmix_fence(ucp_worker_h worker);
Honggang Li c03243
diff --git a/opal/mca/common/ucx/configure.m4 b/opal/mca/common/ucx/configure.m4
Honggang Li c03243
index af8628a889c6..27e07c2005b2 100644
Honggang Li c03243
--- a/opal/mca/common/ucx/configure.m4
Honggang Li c03243
+++ b/opal/mca/common/ucx/configure.m4
Honggang Li c03243
@@ -18,8 +18,6 @@ AC_DEFUN([MCA_opal_common_ucx_CONFIG],[
Honggang Li c03243
                [common_ucx_happy="yes"],
Honggang Li c03243
                [common_ucx_happy="no"])
Honggang Li c03243
 
Honggang Li c03243
-    AC_CHECK_DECLS([open_memstream], [], [], [[#include <stdio.h>]])
Honggang Li c03243
-
Honggang Li c03243
     AS_IF([test "$common_ucx_happy" = "yes"],
Honggang Li c03243
           [$1],
Honggang Li c03243
           [$2])
Honggang Li c03243
-- 
Honggang Li c03243
2.31.1
Honggang Li c03243