/*
* LGPL HEADER START
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of the
* License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*
* LGPL HEADER END
*
* Copyright (c) 2015, James Simmons
*
* Copyright (c) 2016, Intel Corporation.
*
* Author:
* James Simmons
*/
#include
#include
#include
#include "liblnetconfig.h"
#include "cyaml.h"
static int
lustre_ko2iblnd_show_net(struct cYAML *lndparams,
struct lnet_ioctl_config_lnd_tunables *tunables)
{
struct lnet_ioctl_config_o2iblnd_tunables *lnd_cfg;
lnd_cfg = &tunables->lt_tun_u.lt_o2ib;
if (cYAML_create_number(lndparams, "peercredits_hiw",
lnd_cfg->lnd_peercredits_hiw) == NULL)
return -1;
if (cYAML_create_number(lndparams, "map_on_demand",
lnd_cfg->lnd_map_on_demand) == NULL)
return -1;
if (cYAML_create_number(lndparams, "concurrent_sends",
lnd_cfg->lnd_concurrent_sends) == NULL)
return -1;
if (cYAML_create_number(lndparams, "fmr_pool_size",
lnd_cfg->lnd_fmr_pool_size) == NULL)
return -1;
if (cYAML_create_number(lndparams, "fmr_flush_trigger",
lnd_cfg->lnd_fmr_flush_trigger) == NULL)
return -1;
if (cYAML_create_number(lndparams, "fmr_cache",
lnd_cfg->lnd_fmr_cache) == NULL)
return -1;
return 0;
}
int
lustre_interface_show_net(struct cYAML *interfaces, unsigned int index,
bool detail, struct lnet_ioctl_config_data *data,
struct lnet_ioctl_net_config *net_config)
{
char ni_index[2]; /* LNET_MAX_INTERFACES is only 16 */
if (strlen(net_config->ni_interfaces[index]) == 0)
return 0;
snprintf(ni_index, sizeof(ni_index), "%d", index);
if (cYAML_create_string(interfaces, ni_index,
net_config->ni_interfaces[index]) == NULL)
return -1;
if (detail) {
__u32 net = LNET_NETTYP(LNET_NIDNET(data->cfg_nid));
struct lnet_ioctl_config_lnd_tunables *lnd_cfg;
struct cYAML *lndparams;
if (data->cfg_config_u.cfg_net.net_interface_count == 0 ||
net != O2IBLND)
return 0;
lndparams = cYAML_create_object(interfaces, "lnd tunables");
if (lndparams == NULL)
return -1;
lnd_cfg = (struct lnet_ioctl_config_lnd_tunables *)net_config->cfg_bulk;
if (lustre_ko2iblnd_show_net(lndparams, lnd_cfg) < 0)
return -1;
}
return 0;
}
static void
lustre_ko2iblnd_parse_net(struct cYAML *lndparams,
struct lnet_ioctl_config_lnd_tunables *lnd_cfg)
{
struct cYAML *map_on_demand = NULL, *concurrent_sends = NULL;
struct cYAML *fmr_pool_size = NULL, *fmr_cache = NULL;
struct cYAML *fmr_flush_trigger = NULL;
map_on_demand = cYAML_get_object_item(lndparams, "map_on_demand");
lnd_cfg->lt_tun_u.lt_o2ib.lnd_map_on_demand =
(map_on_demand) ? map_on_demand->cy_valueint : 0;
concurrent_sends = cYAML_get_object_item(lndparams, "concurrent_sends");
lnd_cfg->lt_tun_u.lt_o2ib.lnd_concurrent_sends =
(concurrent_sends) ? concurrent_sends->cy_valueint : 0;
fmr_pool_size = cYAML_get_object_item(lndparams, "fmr_pool_size");
lnd_cfg->lt_tun_u.lt_o2ib.lnd_fmr_pool_size =
(fmr_pool_size) ? fmr_pool_size->cy_valueint : 0;
fmr_flush_trigger = cYAML_get_object_item(lndparams,
"fmr_flush_trigger");
lnd_cfg->lt_tun_u.lt_o2ib.lnd_fmr_flush_trigger =
(fmr_flush_trigger) ? fmr_flush_trigger->cy_valueint : 0;
fmr_cache = cYAML_get_object_item(lndparams, "fmr_cache");
lnd_cfg->lt_tun_u.lt_o2ib.lnd_fmr_cache =
(fmr_cache) ? fmr_cache->cy_valueint : 0;
}
void
lustre_interface_parse(struct cYAML *lndparams, const char *dev_name,
struct lnet_ioctl_config_lnd_tunables *lnd_cfg)
{
if (dev_name != NULL && strstr(dev_name, "ib"))
lustre_ko2iblnd_parse_net(lndparams, lnd_cfg);
}