[prev in list] [next in list] [prev in thread] [next in thread]
List: grub-devel
Subject: Re: [PATCH] tcp: add window scaling support
From: Josef Bacik <jbacik () fb ! com>
Date: 2015-08-18 17:48:20
Message-ID: 55D36FE4.4010506 () fb ! com
[Download RAW message or body]
On 08/17/2015 09:15 AM, Andrei Borzenkov wrote:
> 12.08.2015 18:57, Josef Bacik пишет:
>> Sometimes we have to provision boxes across regions, such as
>> California to
>> Sweden. The http server has a 10 minute timeout, so if we can't get
>> our 250mb
>> image transferred fast enough our provisioning fails, which is not
>> ideal. So
>> add tcp window scaling on open connections and set the window size to
>> 1mb. With
>> this change we're able to get higher sustained transfers between
>> regions and can
>> transfer our image in well below 10 minutes. Without this patch we'd
>> time out
>> every time halfway through the transfer. Thanks,
>>
>
> I do not think having 1M TCP window by default is good idea. We probably
> could make it configurable if there are evidences that it is really
> required.
Ok I'll add a config option.
>
>> Signed-off-by: Josef Bacik <jbacik@fb.com>
>> ---
>> grub-core/net/tcp.c | 42 +++++++++++++++++++++++++++++-------------
>> 1 file changed, 29 insertions(+), 13 deletions(-)
>>
>> diff --git a/grub-core/net/tcp.c b/grub-core/net/tcp.c
>> index 5da8b11..57a6d4e 100644
>> --- a/grub-core/net/tcp.c
>> +++ b/grub-core/net/tcp.c
>> @@ -106,6 +106,18 @@ struct tcphdr
>> grub_uint16_t urgent;
>> } GRUB_PACKED;
>>
>> +struct tcp_scale_opt {
>> + grub_uint8_t kind;
>> + grub_uint8_t length;
>> + grub_uint8_t scale;
>> +} GRUB_PACKED;
>> +
>> +struct tcp_synhdr {
>> + struct tcphdr tcphdr;
>> + struct tcp_scale_opt scale_opt;
>> + grub_uint8_t padding;
>> +};
>> +
>
> No, this does not scale. Just allocate large enough buffer and use
> pointers inside it. We may want to support multiple options at some point.
Fair enough.
>
>> struct tcp_pseudohdr
>> {
>> grub_uint32_t src;
>> @@ -555,7 +567,7 @@ grub_net_tcp_open (char *server,
>> grub_net_tcp_socket_t socket;
>> static grub_uint16_t in_port = 21550;
>> struct grub_net_buff *nb;
>> - struct tcphdr *tcph;
>> + struct tcp_synhdr *tcph;
>> int i;
>> grub_uint8_t *nbd;
>> grub_net_link_level_address_t ll_target_addr;
>> @@ -617,20 +629,24 @@ grub_net_tcp_open (char *server,
>> }
>>
>> tcph = (void *) nb->data;
>> + grub_memset(tcph, 0, sizeof (*tcph));
>> socket->my_start_seq = grub_get_time_ms ();
>> socket->my_cur_seq = socket->my_start_seq + 1;
>> - socket->my_window = 8192;
>> - tcph->seqnr = grub_cpu_to_be32 (socket->my_start_seq);
>> - tcph->ack = grub_cpu_to_be32_compile_time (0);
>> - tcph->flags = grub_cpu_to_be16_compile_time ((5 << 12) | TCP_SYN);
>> - tcph->window = grub_cpu_to_be16 (socket->my_window);
>> - tcph->urgent = 0;
>> - tcph->src = grub_cpu_to_be16 (socket->in_port);
>> - tcph->dst = grub_cpu_to_be16 (socket->out_port);
>> - tcph->checksum = 0;
>> - tcph->checksum = grub_net_ip_transport_checksum (nb, GRUB_NET_IP_TCP,
>> - &socket->inf->address,
>> - &socket->out_nla);
>> + socket->my_window = 32768;
>> + tcph->tcphdr.seqnr = grub_cpu_to_be32 (socket->my_start_seq);
>> + tcph->tcphdr.ack = grub_cpu_to_be32_compile_time (0);
>> + tcph->tcphdr.flags = grub_cpu_to_be16_compile_time ((6 << 12) |
>> TCP_SYN);
>> + tcph->tcphdr.window = grub_cpu_to_be16 (socket->my_window);
>> + tcph->tcphdr.urgent = 0;
>> + tcph->tcphdr.src = grub_cpu_to_be16 (socket->in_port);
>> + tcph->tcphdr.dst = grub_cpu_to_be16 (socket->out_port);
>> + tcph->tcphdr.checksum = 0;
>> + tcph->scale_opt.kind = 3;
>> + tcph->scale_opt.length = 3;
>> + tcph->scale_opt.scale = 5;
>> + tcph->tcphdr.checksum = grub_net_ip_transport_checksum (nb,
>> GRUB_NET_IP_TCP,
>> + &socket->inf->address,
>> + &socket->out_nla);
>>
>> tcp_socket_register (socket);
>>
>>
>
> There is one more place - grub_net_tcp_accept. Not sure if it ever be
> used though.
So I only care about connections we open, not about connections that are
opened to us which is why I did it this way. If we start to care about
how fast grub can transfer stuff _to_ somebody else we can add it there
as well. Thanks,
Josef
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic