Commit df8ea19b authored by YOSHIFUJI Hideaki's avatar YOSHIFUJI Hideaki

[XFRM] IPV6: Optimize __xfrm_tunnel_alloc_spi().

| % size old/net/ipv6/xfrm6_tunnel.o new/net/ipv6/xfrm6_tunnel.o
|    text	   data	    bss	    dec	    hex	filename
|    1606	     40	   2080	   3726	    e8e	old/net/ipv6/xfrm6_tunnel.o
|    1574	     40	   2080	   3694	    e6e	new/net/ipv6/xfrm6_tunnel.o
Signed-off-by: default avatarYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
parent a002c6fd
...@@ -140,12 +140,26 @@ __be32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr) ...@@ -140,12 +140,26 @@ __be32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr)
EXPORT_SYMBOL(xfrm6_tunnel_spi_lookup); EXPORT_SYMBOL(xfrm6_tunnel_spi_lookup);
static int __xfrm6_tunnel_spi_check(u32 spi)
{
struct xfrm6_tunnel_spi *x6spi;
int index = xfrm6_tunnel_spi_hash_byspi(spi);
struct hlist_node *pos;
hlist_for_each_entry(x6spi, pos,
&xfrm6_tunnel_spi_byspi[index],
list_byspi) {
if (x6spi->spi == spi)
return -1;
}
return index;
}
static u32 __xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr) static u32 __xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr)
{ {
u32 spi; u32 spi;
struct xfrm6_tunnel_spi *x6spi; struct xfrm6_tunnel_spi *x6spi;
struct hlist_node *pos; int index;
unsigned index;
if (xfrm6_tunnel_spi < XFRM6_TUNNEL_SPI_MIN || if (xfrm6_tunnel_spi < XFRM6_TUNNEL_SPI_MIN ||
xfrm6_tunnel_spi >= XFRM6_TUNNEL_SPI_MAX) xfrm6_tunnel_spi >= XFRM6_TUNNEL_SPI_MAX)
...@@ -154,32 +168,19 @@ static u32 __xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr) ...@@ -154,32 +168,19 @@ static u32 __xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr)
xfrm6_tunnel_spi++; xfrm6_tunnel_spi++;
for (spi = xfrm6_tunnel_spi; spi <= XFRM6_TUNNEL_SPI_MAX; spi++) { for (spi = xfrm6_tunnel_spi; spi <= XFRM6_TUNNEL_SPI_MAX; spi++) {
index = xfrm6_tunnel_spi_hash_byspi(spi); index = __xfrm6_tunnel_spi_check(spi);
hlist_for_each_entry(x6spi, pos, if (index >= 0)
&xfrm6_tunnel_spi_byspi[index], goto alloc_spi;
list_byspi) {
if (x6spi->spi == spi)
goto try_next_1;
}
xfrm6_tunnel_spi = spi;
goto alloc_spi;
try_next_1:;
} }
for (spi = XFRM6_TUNNEL_SPI_MIN; spi < xfrm6_tunnel_spi; spi++) { for (spi = XFRM6_TUNNEL_SPI_MIN; spi < xfrm6_tunnel_spi; spi++) {
index = xfrm6_tunnel_spi_hash_byspi(spi); index = __xfrm6_tunnel_spi_check(spi);
hlist_for_each_entry(x6spi, pos, if (index >= 0)
&xfrm6_tunnel_spi_byspi[index], goto alloc_spi;
list_byspi) {
if (x6spi->spi == spi)
goto try_next_2;
}
xfrm6_tunnel_spi = spi;
goto alloc_spi;
try_next_2:;
} }
spi = 0; spi = 0;
goto out; goto out;
alloc_spi: alloc_spi:
xfrm6_tunnel_spi = spi;
x6spi = kmem_cache_alloc(xfrm6_tunnel_spi_kmem, GFP_ATOMIC); x6spi = kmem_cache_alloc(xfrm6_tunnel_spi_kmem, GFP_ATOMIC);
if (!x6spi) if (!x6spi)
goto out; goto out;
......
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