From e4c8c063b8ae7e4d7f38b657f8c43c1c8829ba4b Mon Sep 17 00:00:00 2001 From: Augustin Degomme Date: Thu, 7 Mar 2013 10:48:22 +0100 Subject: [PATCH] add limiter_link option to cluster tag, to add a pseudo-shared link, to limit bandwidth reachable with a fullduplex link --- include/simgrid/platf.h | 1 + include/surf/simgrid_dtd.h | 5 +++++ src/include/surf/surfxml_parse_values.h | 1 + src/surf/simgrid.dtd | 1 + src/surf/surf_routing.c | 22 ++++++++++++++++++++++ src/surf/surf_routing_cluster.c | 9 ++++++++- src/surf/surfxml_parse.c | 2 ++ 7 files changed, 40 insertions(+), 1 deletion(-) diff --git a/include/simgrid/platf.h b/include/simgrid/platf.h index 49ad142b00..29e76064e5 100644 --- a/include/simgrid/platf.h +++ b/include/simgrid/platf.h @@ -187,6 +187,7 @@ typedef struct s_sg_platf_cluster_cbarg { double lat; double bb_bw; double bb_lat; + double limiter_link; const char* router_id; e_surf_link_sharing_policy_t sharing_policy; e_surf_link_sharing_policy_t bb_sharing_policy; diff --git a/include/surf/simgrid_dtd.h b/include/surf/simgrid_dtd.h index 00bea13a5a..930d5bb4e1 100644 --- a/include/surf/simgrid_dtd.h +++ b/include/surf/simgrid_dtd.h @@ -304,6 +304,8 @@ typedef int AT_surfxml_random_std___deviation; #define AU_surfxml_random_std___deviation NULL typedef int AT_surfxml_cluster_core; #define AU_surfxml_cluster_core NULL +typedef int AT_surfxml_cluster_limiter___link; +#define AU_surfxml_cluster_limiter___link NULL typedef int AT_surfxml_host_state___file; #define AU_surfxml_host_state___file NULL typedef int AT_surfxml_route_dst; @@ -632,6 +634,9 @@ XBT_PUBLIC_DATA(short int) surfxml_random_std___deviation_isset; XBT_PUBLIC_DATA(AT_surfxml_cluster_core) AX_surfxml_cluster_core; #define A_surfxml_cluster_core (surfxml_bufferstack + AX_surfxml_cluster_core) XBT_PUBLIC_DATA(short int) surfxml_cluster_core_isset; +XBT_PUBLIC_DATA(AT_surfxml_cluster_limiter___link) AX_surfxml_cluster_limiter___link; +#define A_surfxml_cluster_limiter___link (surfxml_bufferstack + AX_surfxml_cluster_limiter___link) +XBT_PUBLIC_DATA(short int) surfxml_cluster_limiter___link_isset; XBT_PUBLIC_DATA(AT_surfxml_host_state___file) AX_surfxml_host_state___file; #define A_surfxml_host_state___file (surfxml_bufferstack + AX_surfxml_host_state___file) XBT_PUBLIC_DATA(short int) surfxml_host_state___file_isset; diff --git a/src/include/surf/surfxml_parse_values.h b/src/include/surf/surfxml_parse_values.h index 0092095617..389b67c7c9 100644 --- a/src/include/surf/surfxml_parse_values.h +++ b/src/include/surf/surfxml_parse_values.h @@ -12,6 +12,7 @@ typedef struct s_surf_parsing_link_up_down *surf_parsing_link_up_down_t; typedef struct s_surf_parsing_link_up_down { void* link_up; void* link_down; + void* limiter_link; } s_surf_parsing_link_up_down_t; #endif /* SURFXML_PARSE_VALUES_H_ */ diff --git a/src/surf/simgrid.dtd b/src/surf/simgrid.dtd index 9674277615..067e4a4e1d 100644 --- a/src/surf/simgrid.dtd +++ b/src/surf/simgrid.dtd @@ -82,6 +82,7 @@ + diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 8e25069cc7..32de839336 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -897,6 +897,28 @@ static void routing_parse_cluster(sg_platf_cluster_cbarg_t cluster) info.link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL); info.link_down = info.link_up; } + + if(cluster->limiter_link!=0){ + char *tmp_link = bprintf("%s_limiter", link_id); + XBT_DEBUG("", tmp_link, + cluster->limiter_link); + + + memset(&link, 0, sizeof(link)); + link.id = tmp_link; + link.bandwidth = cluster->limiter_link; + link.latency = 0; + link.state = SURF_RESOURCE_ON; + link.policy = SURF_LINK_SHARED; + sg_platf_new_link(&link); + info.limiter_link = + xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL); + free(tmp_link); + }else{ + info.limiter_link =NULL; + } + + xbt_dynar_push(current_routing->link_up_down_list,&info); xbt_free(link_id); xbt_free(host_id); diff --git a/src/surf/surf_routing_cluster.c b/src/surf/surf_routing_cluster.c index f19670f390..a3308dad16 100644 --- a/src/surf/surf_routing_cluster.c +++ b/src/surf/surf_routing_cluster.c @@ -23,13 +23,16 @@ static void cluster_get_route_and_latency(AS_t as, { s_surf_parsing_link_up_down_t info; - XBT_DEBUG("cluster_get_route_and_latency from '%s'[%d] to '%s'[%d]", + XBT_VERB("cluster_get_route_and_latency from '%s'[%d] to '%s'[%d]", src->name, src->id, dst->name, dst->id); if (src->rc_type != SURF_NETWORK_ELEMENT_ROUTER) { // No specific link for router info = xbt_dynar_get_as(as->link_up_down_list, src->id, s_surf_parsing_link_up_down_t); + if (info.limiter_link) // limiter for sender + xbt_dynar_push_as(route->link_list, void *, info.limiter_link); + if (info.link_up) { // link up xbt_dynar_push_as(route->link_list, void *, info.link_up); if (lat) @@ -58,6 +61,10 @@ static void cluster_get_route_and_latency(AS_t as, surf_network_model->extension.network.get_link_latency(info. link_down); } + + if (info.limiter_link) // limiter for receiver + xbt_dynar_push_as(route->link_list, void *, info.limiter_link); + } } diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index 18a6f496f2..64d6f7fc41 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -348,6 +348,8 @@ void STag_surfxml_cluster(void){ cluster.bb_bw = surf_parse_get_double(A_surfxml_cluster_bb___bw); if(strcmp(A_surfxml_cluster_bb___lat,"")) cluster.bb_lat = surf_parse_get_double(A_surfxml_cluster_bb___lat); + if(strcmp(A_surfxml_cluster_limiter___link,"")) + cluster.limiter_link = surf_parse_get_double(A_surfxml_cluster_limiter___link); cluster.router_id = A_surfxml_cluster_router___id; switch (AX_surfxml_cluster_sharing___policy) { -- 2.20.1