xfrm: store xfrm_mode directly, not its address
This structure is now only 4 bytes, so its more efficient to cache a copy rather than its address. No significant size difference in allmodconfig vmlinux. With non-modular kernel that has all XFRM options enabled, this series reduces vmlinux image size by ~11kb. All xfrm_mode indirections are gone and all modes are built-in. before (ipsec-next master): text data bss dec filename 21071494 7233140 11104324 39408958 vmlinux.master after this series: 21066448 7226772 11104324 39397544 vmlinux.patched With allmodconfig kernel, the size increase is only 362 bytes, even all the xfrm config options removed in this series are modular. before: text data bss dec filename 15731286 6936912 4046908 26715106 vmlinux.master after this series: 15731492 6937068 4046908 26715468 vmlinux Signed-off-by: Florian Westphal <fw@strlen.de> Reviewed-by: Sabrina Dubroca <sd@queasysnail.net> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:

committed by
Steffen Klassert

parent
4c145dce26
commit
c9500d7b7d
@@ -132,6 +132,17 @@ struct xfrm_state_offload {
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
struct xfrm_mode {
|
||||
u8 encap;
|
||||
u8 family;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
/* Flags for xfrm_mode. */
|
||||
enum {
|
||||
XFRM_MODE_FLAG_TUNNEL = 1,
|
||||
};
|
||||
|
||||
/* Full description of state of transformer. */
|
||||
struct xfrm_state {
|
||||
possible_net_t xs_net;
|
||||
@@ -234,9 +245,9 @@ struct xfrm_state {
|
||||
/* Reference to data common to all the instances of this
|
||||
* transformer. */
|
||||
const struct xfrm_type *type;
|
||||
const struct xfrm_mode *inner_mode;
|
||||
const struct xfrm_mode *inner_mode_iaf;
|
||||
const struct xfrm_mode *outer_mode;
|
||||
struct xfrm_mode inner_mode;
|
||||
struct xfrm_mode inner_mode_iaf;
|
||||
struct xfrm_mode outer_mode;
|
||||
|
||||
const struct xfrm_type_offload *type_offload;
|
||||
|
||||
@@ -421,17 +432,6 @@ struct xfrm_type_offload {
|
||||
int xfrm_register_type_offload(const struct xfrm_type_offload *type, unsigned short family);
|
||||
int xfrm_unregister_type_offload(const struct xfrm_type_offload *type, unsigned short family);
|
||||
|
||||
struct xfrm_mode {
|
||||
u8 encap;
|
||||
u8 family;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
/* Flags for xfrm_mode. */
|
||||
enum {
|
||||
XFRM_MODE_FLAG_TUNNEL = 1,
|
||||
};
|
||||
|
||||
static inline int xfrm_af2proto(unsigned int family)
|
||||
{
|
||||
switch(family) {
|
||||
@@ -448,9 +448,9 @@ static inline const struct xfrm_mode *xfrm_ip2inner_mode(struct xfrm_state *x, i
|
||||
{
|
||||
if ((ipproto == IPPROTO_IPIP && x->props.family == AF_INET) ||
|
||||
(ipproto == IPPROTO_IPV6 && x->props.family == AF_INET6))
|
||||
return x->inner_mode;
|
||||
return &x->inner_mode;
|
||||
else
|
||||
return x->inner_mode_iaf;
|
||||
return &x->inner_mode_iaf;
|
||||
}
|
||||
|
||||
struct xfrm_tmpl {
|
||||
@@ -1990,7 +1990,7 @@ static inline int xfrm_tunnel_check(struct sk_buff *skb, struct xfrm_state *x,
|
||||
tunnel = true;
|
||||
break;
|
||||
}
|
||||
if (tunnel && !(x->outer_mode->flags & XFRM_MODE_FLAG_TUNNEL))
|
||||
if (tunnel && !(x->outer_mode.flags & XFRM_MODE_FLAG_TUNNEL))
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user