Commit bb9d8454 authored by David S. Miller's avatar David S. Miller

Merge branch 'tipc-introduce-variable-window-congestion-control'

Jon Maloy says:

====================
tipc: introduce variable window congestion control

We improve thoughput greatly by introducing a variety of the Reno
congestion control algorithm at the link level.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 08cbc75f 16ad3f40
...@@ -562,18 +562,18 @@ int tipc_bclink_reset_stats(struct net *net) ...@@ -562,18 +562,18 @@ int tipc_bclink_reset_stats(struct net *net)
return 0; return 0;
} }
static int tipc_bc_link_set_queue_limits(struct net *net, u32 limit) static int tipc_bc_link_set_queue_limits(struct net *net, u32 max_win)
{ {
struct tipc_link *l = tipc_bc_sndlink(net); struct tipc_link *l = tipc_bc_sndlink(net);
if (!l) if (!l)
return -ENOPROTOOPT; return -ENOPROTOOPT;
if (limit < BCLINK_WIN_MIN) if (max_win < BCLINK_WIN_MIN)
limit = BCLINK_WIN_MIN; max_win = BCLINK_WIN_MIN;
if (limit > TIPC_MAX_LINK_WIN) if (max_win > TIPC_MAX_LINK_WIN)
return -EINVAL; return -EINVAL;
tipc_bcast_lock(net); tipc_bcast_lock(net);
tipc_link_set_queue_limits(l, limit); tipc_link_set_queue_limits(l, BCLINK_WIN_MIN, max_win);
tipc_bcast_unlock(net); tipc_bcast_unlock(net);
return 0; return 0;
} }
...@@ -683,6 +683,7 @@ int tipc_bcast_init(struct net *net) ...@@ -683,6 +683,7 @@ int tipc_bcast_init(struct net *net)
if (!tipc_link_bc_create(net, 0, 0, if (!tipc_link_bc_create(net, 0, 0,
FB_MTU, FB_MTU,
BCLINK_WIN_DEFAULT, BCLINK_WIN_DEFAULT,
BCLINK_WIN_DEFAULT,
0, 0,
&bb->inputq, &bb->inputq,
NULL, NULL,
......
...@@ -311,7 +311,8 @@ static int tipc_enable_bearer(struct net *net, const char *name, ...@@ -311,7 +311,8 @@ static int tipc_enable_bearer(struct net *net, const char *name,
b->identity = bearer_id; b->identity = bearer_id;
b->tolerance = m->tolerance; b->tolerance = m->tolerance;
b->window = m->window; b->min_win = m->min_win;
b->max_win = m->max_win;
b->domain = disc_domain; b->domain = disc_domain;
b->net_plane = bearer_id + 'A'; b->net_plane = bearer_id + 'A';
b->priority = prio; b->priority = prio;
...@@ -796,7 +797,7 @@ static int __tipc_nl_add_bearer(struct tipc_nl_msg *msg, ...@@ -796,7 +797,7 @@ static int __tipc_nl_add_bearer(struct tipc_nl_msg *msg,
goto prop_msg_full; goto prop_msg_full;
if (nla_put_u32(msg->skb, TIPC_NLA_PROP_TOL, bearer->tolerance)) if (nla_put_u32(msg->skb, TIPC_NLA_PROP_TOL, bearer->tolerance))
goto prop_msg_full; goto prop_msg_full;
if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, bearer->window)) if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, bearer->max_win))
goto prop_msg_full; goto prop_msg_full;
if (bearer->media->type_id == TIPC_MEDIA_TYPE_UDP) if (bearer->media->type_id == TIPC_MEDIA_TYPE_UDP)
if (nla_put_u32(msg->skb, TIPC_NLA_PROP_MTU, bearer->mtu)) if (nla_put_u32(msg->skb, TIPC_NLA_PROP_MTU, bearer->mtu))
...@@ -1088,7 +1089,7 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info) ...@@ -1088,7 +1089,7 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
if (props[TIPC_NLA_PROP_PRIO]) if (props[TIPC_NLA_PROP_PRIO])
b->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]); b->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
if (props[TIPC_NLA_PROP_WIN]) if (props[TIPC_NLA_PROP_WIN])
b->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]); b->max_win = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
if (props[TIPC_NLA_PROP_MTU]) { if (props[TIPC_NLA_PROP_MTU]) {
if (b->media->type_id != TIPC_MEDIA_TYPE_UDP) if (b->media->type_id != TIPC_MEDIA_TYPE_UDP)
return -EINVAL; return -EINVAL;
...@@ -1142,7 +1143,7 @@ static int __tipc_nl_add_media(struct tipc_nl_msg *msg, ...@@ -1142,7 +1143,7 @@ static int __tipc_nl_add_media(struct tipc_nl_msg *msg,
goto prop_msg_full; goto prop_msg_full;
if (nla_put_u32(msg->skb, TIPC_NLA_PROP_TOL, media->tolerance)) if (nla_put_u32(msg->skb, TIPC_NLA_PROP_TOL, media->tolerance))
goto prop_msg_full; goto prop_msg_full;
if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, media->window)) if (nla_put_u32(msg->skb, TIPC_NLA_PROP_WIN, media->max_win))
goto prop_msg_full; goto prop_msg_full;
if (media->type_id == TIPC_MEDIA_TYPE_UDP) if (media->type_id == TIPC_MEDIA_TYPE_UDP)
if (nla_put_u32(msg->skb, TIPC_NLA_PROP_MTU, media->mtu)) if (nla_put_u32(msg->skb, TIPC_NLA_PROP_MTU, media->mtu))
...@@ -1275,7 +1276,7 @@ int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info) ...@@ -1275,7 +1276,7 @@ int __tipc_nl_media_set(struct sk_buff *skb, struct genl_info *info)
if (props[TIPC_NLA_PROP_PRIO]) if (props[TIPC_NLA_PROP_PRIO])
m->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]); m->priority = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
if (props[TIPC_NLA_PROP_WIN]) if (props[TIPC_NLA_PROP_WIN])
m->window = nla_get_u32(props[TIPC_NLA_PROP_WIN]); m->max_win = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
if (props[TIPC_NLA_PROP_MTU]) { if (props[TIPC_NLA_PROP_MTU]) {
if (m->type_id != TIPC_MEDIA_TYPE_UDP) if (m->type_id != TIPC_MEDIA_TYPE_UDP)
return -EINVAL; return -EINVAL;
......
...@@ -119,7 +119,8 @@ struct tipc_media { ...@@ -119,7 +119,8 @@ struct tipc_media {
char *raw); char *raw);
u32 priority; u32 priority;
u32 tolerance; u32 tolerance;
u32 window; u32 min_win;
u32 max_win;
u32 mtu; u32 mtu;
u32 type_id; u32 type_id;
u32 hwaddr_len; u32 hwaddr_len;
...@@ -158,7 +159,8 @@ struct tipc_bearer { ...@@ -158,7 +159,8 @@ struct tipc_bearer {
struct packet_type pt; struct packet_type pt;
struct rcu_head rcu; struct rcu_head rcu;
u32 priority; u32 priority;
u32 window; u32 min_win;
u32 max_win;
u32 tolerance; u32 tolerance;
u32 domain; u32 domain;
u32 identity; u32 identity;
......
...@@ -92,7 +92,8 @@ struct tipc_media eth_media_info = { ...@@ -92,7 +92,8 @@ struct tipc_media eth_media_info = {
.raw2addr = tipc_eth_raw2addr, .raw2addr = tipc_eth_raw2addr,
.priority = TIPC_DEF_LINK_PRI, .priority = TIPC_DEF_LINK_PRI,
.tolerance = TIPC_DEF_LINK_TOL, .tolerance = TIPC_DEF_LINK_TOL,
.window = TIPC_DEF_LINK_WIN, .min_win = TIPC_DEF_LINK_WIN,
.max_win = TIPC_MAX_LINK_WIN,
.type_id = TIPC_MEDIA_TYPE_ETH, .type_id = TIPC_MEDIA_TYPE_ETH,
.hwaddr_len = ETH_ALEN, .hwaddr_len = ETH_ALEN,
.name = "eth" .name = "eth"
......
...@@ -42,6 +42,8 @@ ...@@ -42,6 +42,8 @@
#include "core.h" #include "core.h"
#include "bearer.h" #include "bearer.h"
#define TIPC_MAX_IB_LINK_WIN 500
/* convert InfiniBand address (media address format) media address to string */ /* convert InfiniBand address (media address format) media address to string */
static int tipc_ib_addr2str(struct tipc_media_addr *a, char *str_buf, static int tipc_ib_addr2str(struct tipc_media_addr *a, char *str_buf,
int str_size) int str_size)
...@@ -94,7 +96,8 @@ struct tipc_media ib_media_info = { ...@@ -94,7 +96,8 @@ struct tipc_media ib_media_info = {
.raw2addr = tipc_ib_raw2addr, .raw2addr = tipc_ib_raw2addr,
.priority = TIPC_DEF_LINK_PRI, .priority = TIPC_DEF_LINK_PRI,
.tolerance = TIPC_DEF_LINK_TOL, .tolerance = TIPC_DEF_LINK_TOL,
.window = TIPC_DEF_LINK_WIN, .min_win = TIPC_DEF_LINK_WIN,
.max_win = TIPC_MAX_IB_LINK_WIN,
.type_id = TIPC_MEDIA_TYPE_IB, .type_id = TIPC_MEDIA_TYPE_IB,
.hwaddr_len = INFINIBAND_ALEN, .hwaddr_len = INFINIBAND_ALEN,
.name = "ib" .name = "ib"
......
This diff is collapsed.
...@@ -73,7 +73,7 @@ enum { ...@@ -73,7 +73,7 @@ enum {
bool tipc_link_create(struct net *net, char *if_name, int bearer_id, bool tipc_link_create(struct net *net, char *if_name, int bearer_id,
int tolerance, char net_plane, u32 mtu, int priority, int tolerance, char net_plane, u32 mtu, int priority,
int window, u32 session, u32 ownnode, u32 min_win, u32 max_win, u32 session, u32 ownnode,
u32 peer, u8 *peer_id, u16 peer_caps, u32 peer, u8 *peer_id, u16 peer_caps,
struct tipc_link *bc_sndlink, struct tipc_link *bc_sndlink,
struct tipc_link *bc_rcvlink, struct tipc_link *bc_rcvlink,
...@@ -81,7 +81,7 @@ bool tipc_link_create(struct net *net, char *if_name, int bearer_id, ...@@ -81,7 +81,7 @@ bool tipc_link_create(struct net *net, char *if_name, int bearer_id,
struct sk_buff_head *namedq, struct sk_buff_head *namedq,
struct tipc_link **link); struct tipc_link **link);
bool tipc_link_bc_create(struct net *net, u32 ownnode, u32 peer, bool tipc_link_bc_create(struct net *net, u32 ownnode, u32 peer,
int mtu, int window, u16 peer_caps, int mtu, u32 min_win, u32 max_win, u16 peer_caps,
struct sk_buff_head *inputq, struct sk_buff_head *inputq,
struct sk_buff_head *namedq, struct sk_buff_head *namedq,
struct tipc_link *bc_sndlink, struct tipc_link *bc_sndlink,
...@@ -115,7 +115,8 @@ char *tipc_link_name_ext(struct tipc_link *l, char *buf); ...@@ -115,7 +115,8 @@ char *tipc_link_name_ext(struct tipc_link *l, char *buf);
u32 tipc_link_state(struct tipc_link *l); u32 tipc_link_state(struct tipc_link *l);
char tipc_link_plane(struct tipc_link *l); char tipc_link_plane(struct tipc_link *l);
int tipc_link_prio(struct tipc_link *l); int tipc_link_prio(struct tipc_link *l);
int tipc_link_window(struct tipc_link *l); int tipc_link_min_win(struct tipc_link *l);
int tipc_link_max_win(struct tipc_link *l);
void tipc_link_update_caps(struct tipc_link *l, u16 capabilities); void tipc_link_update_caps(struct tipc_link *l, u16 capabilities);
bool tipc_link_validate_msg(struct tipc_link *l, struct tipc_msg *hdr); bool tipc_link_validate_msg(struct tipc_link *l, struct tipc_msg *hdr);
unsigned long tipc_link_tolerance(struct tipc_link *l); unsigned long tipc_link_tolerance(struct tipc_link *l);
...@@ -124,7 +125,7 @@ void tipc_link_set_tolerance(struct tipc_link *l, u32 tol, ...@@ -124,7 +125,7 @@ void tipc_link_set_tolerance(struct tipc_link *l, u32 tol,
void tipc_link_set_prio(struct tipc_link *l, u32 prio, void tipc_link_set_prio(struct tipc_link *l, u32 prio,
struct sk_buff_head *xmitq); struct sk_buff_head *xmitq);
void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit); void tipc_link_set_abort_limit(struct tipc_link *l, u32 limit);
void tipc_link_set_queue_limits(struct tipc_link *l, u32 window); void tipc_link_set_queue_limits(struct tipc_link *l, u32 min_win, u32 max_win);
int __tipc_nl_add_link(struct net *net, struct tipc_nl_msg *msg, int __tipc_nl_add_link(struct net *net, struct tipc_nl_msg *msg,
struct tipc_link *link, int nlflags); struct tipc_link *link, int nlflags);
int tipc_nl_parse_link_prop(struct nlattr *prop, struct nlattr *props[]); int tipc_nl_parse_link_prop(struct nlattr *prop, struct nlattr *props[]);
......
...@@ -1139,7 +1139,8 @@ void tipc_node_check_dest(struct net *net, u32 addr, ...@@ -1139,7 +1139,8 @@ void tipc_node_check_dest(struct net *net, u32 addr,
snd_l = tipc_bc_sndlink(net); snd_l = tipc_bc_sndlink(net);
if (!tipc_link_bc_create(net, tipc_own_addr(net), if (!tipc_link_bc_create(net, tipc_own_addr(net),
addr, U16_MAX, addr, U16_MAX,
tipc_link_window(snd_l), tipc_link_min_win(snd_l),
tipc_link_max_win(snd_l),
n->capabilities, n->capabilities,
&n->bc_entry.inputq1, &n->bc_entry.inputq1,
&n->bc_entry.namedq, snd_l, &n->bc_entry.namedq, snd_l,
...@@ -1233,7 +1234,7 @@ void tipc_node_check_dest(struct net *net, u32 addr, ...@@ -1233,7 +1234,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,
get_random_bytes(&session, sizeof(u16)); get_random_bytes(&session, sizeof(u16));
if (!tipc_link_create(net, if_name, b->identity, b->tolerance, if (!tipc_link_create(net, if_name, b->identity, b->tolerance,
b->net_plane, b->mtu, b->priority, b->net_plane, b->mtu, b->priority,
b->window, session, b->min_win, b->max_win, session,
tipc_own_addr(net), addr, peer_id, tipc_own_addr(net), addr, peer_id,
n->capabilities, n->capabilities,
tipc_bc_sndlink(n->net), n->bc_entry.link, tipc_bc_sndlink(n->net), n->bc_entry.link,
...@@ -2360,8 +2361,7 @@ int tipc_nl_node_set_link(struct sk_buff *skb, struct genl_info *info) ...@@ -2360,8 +2361,7 @@ int tipc_nl_node_set_link(struct sk_buff *skb, struct genl_info *info)
if (attrs[TIPC_NLA_LINK_PROP]) { if (attrs[TIPC_NLA_LINK_PROP]) {
struct nlattr *props[TIPC_NLA_PROP_MAX + 1]; struct nlattr *props[TIPC_NLA_PROP_MAX + 1];
err = tipc_nl_parse_link_prop(attrs[TIPC_NLA_LINK_PROP], err = tipc_nl_parse_link_prop(attrs[TIPC_NLA_LINK_PROP], props);
props);
if (err) { if (err) {
res = err; res = err;
goto out; goto out;
...@@ -2380,10 +2380,12 @@ int tipc_nl_node_set_link(struct sk_buff *skb, struct genl_info *info) ...@@ -2380,10 +2380,12 @@ int tipc_nl_node_set_link(struct sk_buff *skb, struct genl_info *info)
tipc_link_set_prio(link, prio, &xmitq); tipc_link_set_prio(link, prio, &xmitq);
} }
if (props[TIPC_NLA_PROP_WIN]) { if (props[TIPC_NLA_PROP_WIN]) {
u32 win; u32 max_win;
win = nla_get_u32(props[TIPC_NLA_PROP_WIN]); max_win = nla_get_u32(props[TIPC_NLA_PROP_WIN]);
tipc_link_set_queue_limits(link, win); tipc_link_set_queue_limits(link,
tipc_link_min_win(link),
max_win);
} }
} }
......
...@@ -828,7 +828,8 @@ struct tipc_media udp_media_info = { ...@@ -828,7 +828,8 @@ struct tipc_media udp_media_info = {
.msg2addr = tipc_udp_msg2addr, .msg2addr = tipc_udp_msg2addr,
.priority = TIPC_DEF_LINK_PRI, .priority = TIPC_DEF_LINK_PRI,
.tolerance = TIPC_DEF_LINK_TOL, .tolerance = TIPC_DEF_LINK_TOL,
.window = TIPC_DEF_LINK_WIN, .min_win = TIPC_DEF_LINK_WIN,
.max_win = TIPC_DEF_LINK_WIN,
.mtu = TIPC_DEF_LINK_UDP_MTU, .mtu = TIPC_DEF_LINK_UDP_MTU,
.type_id = TIPC_MEDIA_TYPE_UDP, .type_id = TIPC_MEDIA_TYPE_UDP,
.hwaddr_len = 0, .hwaddr_len = 0,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment