Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite HTTP strings processing in assembler #1249

Merged
merged 9 commits into from
May 16, 2019
26 changes: 16 additions & 10 deletions lib/str_simd.S
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,24 @@
* best code (e.g. with unnecessary vzeroupper calls) and also requires standard
* includes like stdlib.h.
*
* Copyright (C) 2018 Tempesta Technologies, Inc.
* The implementation doesn't use alignment function prologs since aligned
* version has shown worse performance, see the memcpy.c microbenchmark.
*
* This file 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 3, or (at your option)
* any later version.
* Copyright (C) 2018-2019 Tempesta Technologies, Inc.
*
* This program 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.
* See http://www.gnu.org/licenses/lgpl.html .
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59
* Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <linux/linkage.h>
#include <asm/alternative-asm.h>
Expand Down
5 changes: 4 additions & 1 deletion tempesta_fw/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
# this program; if not, write to the Free Software Foundation, Inc., 59
# Temple Place - Suite 330, Boston, MA 02111-1307, USA.

TTLS_CFLAGS += -I$(src)/../tls -I$(src)/../tls/dummy_headers
TTLS_CFLAGS += -I$(src)/../tls
export TTLS_CFLAGS TFW_CFLAGS

EXTRA_CFLAGS += $(TFW_CFLAGS) $(TTLS_CFLAGS)
Expand All @@ -29,5 +29,8 @@ obj-m = tempesta_fw.o t/

tfw-srcs = $(wildcard $(obj)/*.c)
tfw-objs = $(patsubst %.c, %.o, $(tfw-srcs))
ifdef AVX2
tfw-objs += str_avx2.o
endif

tempesta_fw-objs = $(subst $(src)/,,$(tfw-objs))
2 changes: 1 addition & 1 deletion tempesta_fw/http.c
Original file line number Diff line number Diff line change
Expand Up @@ -4550,7 +4550,7 @@ __cfgop_brange_hndl(TfwCfgSpec *cs, TfwCfgEntry *ce, unsigned char *a)

#define TFW_HTTP_CFG_CUSTOM_BRANGE(name) \
static int \
tfw_cfgop_brange_##name(TfwCfgSpec *cs, TfwCfgEntry *ce) \
tfw_cfgop_brange_##name(TfwCfgSpec *cs, TfwCfgEntry *ce) \
{ \
int r; \
unsigned char a[256] = {}; \
Expand Down
40 changes: 2 additions & 38 deletions tempesta_fw/htype.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
/**
* ASCII codes to accept HTTP token (RFC 7230 3.2.6).
*/
static const unsigned char token_a[] __attribute__((aligned(64))) = {
static const unsigned char token_a[] ____cacheline_aligned = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0,
Expand All @@ -44,43 +44,7 @@ static const unsigned char token_a[] __attribute__((aligned(64))) = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};

/**
* Lower case conversion table.
*/
static const unsigned char __tfw_lct[] __attribute__((aligned(64))) = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
};
extern const unsigned char __tfw_lct[256];

/**
* Check whether a character is CR or LF.
Expand Down
7 changes: 1 addition & 6 deletions tempesta_fw/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Tempesta FW
*
* Copyright (C) 2014 NatSys Lab. (info@natsys-lab.com).
* Copyright (C) 2015-2018 Tempesta Technologies, Inc.
* Copyright (C) 2015-2019 Tempesta Technologies, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -419,11 +419,6 @@ tfw_init(void)
{
int r;

/* Initialize strings SIMD constants at first. */
kernel_fpu_begin();
tfw_str_init_const();
kernel_fpu_end();

TFW_LOG("Initializing Tempesta FW kernel module...\n");

tfw_sysctl_hdr = register_net_sysctl(&init_net, "net/tempesta",
Expand Down