From: Jarno Rajahalme Date: Thu, 24 Oct 2013 20:19:27 +0000 (-0700) Subject: meta-flow: Inline mf_from_id(). X-Git-Tag: v2.1.0~361 X-Git-Url: http://git.cascardo.eti.br/?a=commitdiff_plain;h=7f98c44d8acbaf62ff5375e137bcf37b7336bbc8;p=cascardo%2Fovs.git meta-flow: Inline mf_from_id(). mf_from_id accesses a static table, so the compiler should be able to completely optimize it away. Also use OVS_PACKED_ENUM to waste less space. Signed-off-by: Jarno Rajahalme Signed-off-by: Ben Pfaff --- diff --git a/lib/meta-flow.c b/lib/meta-flow.c index c0925e849..f53f3c486 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -41,7 +41,9 @@ VLOG_DEFINE_THIS_MODULE(meta_flow); sizeof ((union mf_value *)0)->MEMBER, \ 8 * sizeof ((union mf_value *)0)->MEMBER -static const struct mf_field mf_fields[MFF_N_IDS] = { +extern const struct mf_field mf_fields[MFF_N_IDS]; /* Silence a warning. */ + +const struct mf_field mf_fields[MFF_N_IDS] = { /* ## -------- ## */ /* ## metadata ## */ /* ## -------- ## */ @@ -728,14 +730,6 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); const struct mf_field *mf_from_nxm_header__(uint32_t header); static void nxm_init(void); -/* Returns the field with the given 'id'. */ -const struct mf_field * -mf_from_id(enum mf_field_id id) -{ - ovs_assert((unsigned int) id < MFF_N_IDS); - return &mf_fields[id]; -} - /* Returns the field with the given 'name', or a null pointer if no field has * that name. */ const struct mf_field * diff --git a/lib/meta-flow.h b/lib/meta-flow.h index 11502f0a8..c2b0bbc23 100644 --- a/lib/meta-flow.h +++ b/lib/meta-flow.h @@ -24,13 +24,14 @@ #include "ofp-errors.h" #include "ofp-util.h" #include "packets.h" +#include "util.h" struct ds; struct match; /* The comment on each of these indicates the member in "union mf_value" used * to represent its value. */ -enum mf_field_id { +enum OVS_PACKED_ENUM mf_field_id { /* Metadata. */ MFF_TUN_ID, /* be64 */ MFF_TUN_SRC, /* be32 */ @@ -180,7 +181,7 @@ enum mf_field_id { * A field may only be matched if the correct lower-level protocols are also * matched. For example, the TCP port may be matched only if the Ethernet type * matches ETH_TYPE_IP and the IP protocol matches IPPROTO_TCP. */ -enum mf_prereqs { +enum OVS_PACKED_ENUM mf_prereqs { MFP_NONE, /* L2 requirements. */ @@ -209,13 +210,13 @@ enum mf_prereqs { /* Forms of partial-field masking allowed for a field. * * Every field may be masked as a whole. */ -enum mf_maskable { +enum OVS_PACKED_ENUM mf_maskable { MFM_NONE, /* No sub-field masking. */ MFM_FULLY, /* Every bit is individually maskable. */ }; /* How to format or parse a field's value. */ -enum mf_string { +enum OVS_PACKED_ENUM mf_string { /* Integer formats. * * The particular MFS_* constant sets the output format. On input, either @@ -331,11 +332,18 @@ union mf_subvalue { BUILD_ASSERT_DECL(sizeof(union mf_value) == sizeof (union mf_subvalue)); /* Finding mf_fields. */ -const struct mf_field *mf_from_id(enum mf_field_id); const struct mf_field *mf_from_name(const char *name); const struct mf_field *mf_from_nxm_header(uint32_t nxm_header); const struct mf_field *mf_from_nxm_name(const char *nxm_name); +static inline const struct mf_field * +mf_from_id(enum mf_field_id id) +{ + extern const struct mf_field mf_fields[MFF_N_IDS]; + ovs_assert((unsigned int) id < MFF_N_IDS); + return &mf_fields[id]; +} + /* Inspecting wildcarded bits. */ bool mf_is_all_wild(const struct mf_field *, const struct flow_wildcards *);