[ovs-dev] [PATCH v5 1/6] flow: Use unsigned int for counts.
Jarno Rajahalme
jrajahalme at nicira.com
Fri Aug 21 22:25:18 UTC 2015
Reserve the use of size_t for sizes of objects in bytes.
Suggested-by: Joe Stringer <joestringer at nicira.com>
Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
---
lib/classifier-private.h | 10 +++++-----
lib/classifier.c | 45 +++++++++++++++++++++++----------------------
lib/classifier.h | 6 +++---
lib/flow.c | 31 ++++++++++++++++---------------
lib/flow.h | 30 ++++++++++++++++--------------
5 files changed, 63 insertions(+), 59 deletions(-)
diff --git a/lib/classifier-private.h b/lib/classifier-private.h
index 4c5ad80..3b7ea3a 100644
--- a/lib/classifier-private.h
+++ b/lib/classifier-private.h
@@ -287,7 +287,7 @@ flow_hash_in_minimask(const struct flow *flow, const struct minimask *mask,
const uint64_t *flow_u64 = (const uint64_t *)flow;
const uint64_t *p = mask_values;
uint32_t hash;
- size_t idx;
+ unsigned int idx;
hash = basis;
MAP_FOR_EACH_INDEX(idx, mask->masks.tnl_map) {
@@ -341,7 +341,7 @@ flow_hash_in_minimask_range(const struct flow *flow,
struct miniflow map;
const uint64_t *p;
uint32_t hash = *basis;
- size_t idx;
+ unsigned int idx;
offset = miniflow_get_map_in_range(&mask->masks, start, end, &map);
p = mask_values + offset;
@@ -375,7 +375,7 @@ flow_wildcards_fold_minimask_range(struct flow_wildcards *wc,
const uint64_t *p = miniflow_get_values(&mask->masks);
uint64_t *dst_u64 = (uint64_t *)&wc->masks;
struct miniflow map;
- size_t idx;
+ unsigned int idx;
p += miniflow_get_map_in_range(&mask->masks, start, end, &map);
MAP_FOR_EACH_INDEX(idx, map.tnl_map) {
@@ -392,10 +392,10 @@ static inline uint32_t
minimask_hash(const struct minimask *mask, uint32_t basis)
{
const uint64_t *p = miniflow_get_values(&mask->masks);
- size_t n_values = miniflow_n_values(&mask->masks);
+ unsigned int n_values = miniflow_n_values(&mask->masks);
uint32_t hash = basis;
- for (size_t i = 0; i < n_values; i++) {
+ for (unsigned int i = 0; i < n_values; i++) {
hash = hash_add64(hash, *p++);
}
hash = hash_add64(hash, mask->masks.tnl_map);
diff --git a/lib/classifier.c b/lib/classifier.c
index 6484a34..8b59cff 100644
--- a/lib/classifier.c
+++ b/lib/classifier.c
@@ -57,8 +57,8 @@ BUILD_ASSERT_DECL(TP_PORTS_OFS32 == offsetof(struct flow, tp_dst) / 4);
BUILD_ASSERT_DECL(TP_PORTS_OFS32 % 2 == 0);
#define TP_PORTS_OFS64 (TP_PORTS_OFS32 / 2)
-static size_t
-cls_conjunction_set_size(size_t n)
+static unsigned int
+cls_conjunction_set_size(unsigned int n)
{
return (sizeof(struct cls_conjunction_set)
+ n * sizeof(struct cls_conjunction));
@@ -66,11 +66,11 @@ cls_conjunction_set_size(size_t n)
static struct cls_conjunction_set *
cls_conjunction_set_alloc(struct cls_match *match,
- const struct cls_conjunction conj[], size_t n)
+ const struct cls_conjunction conj[], unsigned int n)
{
if (n) {
- size_t min_n_clauses = conj[0].n_clauses;
- for (size_t i = 1; i < n; i++) {
+ unsigned int min_n_clauses = conj[0].n_clauses;
+ for (unsigned int i = 1; i < n; i++) {
min_n_clauses = MIN(min_n_clauses, conj[i].n_clauses);
}
@@ -88,9 +88,9 @@ cls_conjunction_set_alloc(struct cls_match *match,
static struct cls_match *
cls_match_alloc(const struct cls_rule *rule, cls_version_t version,
- const struct cls_conjunction conj[], size_t n)
+ const struct cls_conjunction conj[], unsigned int n)
{
- size_t count = miniflow_n_values(rule->match.flow);
+ unsigned int count = miniflow_n_values(rule->match.flow);
struct cls_match *cls_match
= xmalloc(sizeof *cls_match + MINIFLOW_VALUES_SIZE(count));
@@ -242,7 +242,7 @@ cls_rule_destroy(struct cls_rule *rule)
void
cls_rule_set_conjunctions(struct cls_rule *cr,
- const struct cls_conjunction *conj, size_t n)
+ const struct cls_conjunction *conj, unsigned int n)
{
struct cls_match *match = cr->cls_match;
struct cls_conjunction_set *old
@@ -573,14 +573,14 @@ subtable_replace_head_rule(struct classifier *cls OVS_UNUSED,
const struct cls_rule *
classifier_replace(struct classifier *cls, const struct cls_rule *rule,
cls_version_t version,
- const struct cls_conjunction *conjs, size_t n_conjs)
+ const struct cls_conjunction *conjs, unsigned int n_conjs)
{
struct cls_match *new;
struct cls_subtable *subtable;
uint32_t ihash[CLS_MAX_INDICES];
uint8_t prev_be64ofs = 0;
struct cls_match *head;
- size_t n_rules = 0;
+ unsigned int n_rules = 0;
uint32_t basis;
uint32_t hash;
int i;
@@ -759,7 +759,7 @@ classifier_replace(struct classifier *cls, const struct cls_rule *rule,
void
classifier_insert(struct classifier *cls, const struct cls_rule *rule,
cls_version_t version, const struct cls_conjunction conj[],
- size_t n_conj)
+ unsigned int n_conj)
{
const struct cls_rule *displaced_rule
= classifier_replace(cls, rule, version, conj, n_conj);
@@ -784,7 +784,7 @@ classifier_remove(struct classifier *cls, const struct cls_rule *cls_rule)
int i;
uint32_t basis = 0, hash, ihash[CLS_MAX_INDICES];
uint8_t prev_be64ofs = 0;
- size_t n_rules;
+ unsigned int n_rules;
rule = cls_rule->cls_match;
if (!rule) {
@@ -951,8 +951,8 @@ find_conjunctive_match__(struct hmap *matches, uint64_t id, uint32_t hash)
static bool
find_conjunctive_match(const struct cls_conjunction_set *set,
unsigned int max_n_clauses, struct hmap *matches,
- struct conjunctive_match *cm_stubs, size_t n_cm_stubs,
- uint32_t *idp)
+ struct conjunctive_match *cm_stubs,
+ unsigned int n_cm_stubs, uint32_t *idp)
{
const struct cls_conjunction *c;
@@ -971,7 +971,7 @@ find_conjunctive_match(const struct cls_conjunction_set *set,
hash = hash_int(c->id, 0);
cm = find_conjunctive_match__(matches, c->id, hash);
if (!cm) {
- size_t n = hmap_count(matches);
+ unsigned int n = hmap_count(matches);
cm = n < n_cm_stubs ? &cm_stubs[n] : xmalloc(sizeof *cm);
hmap_insert(matches, &cm->hmap_node, hash);
@@ -989,7 +989,8 @@ find_conjunctive_match(const struct cls_conjunction_set *set,
static void
free_conjunctive_matches(struct hmap *matches,
- struct conjunctive_match *cm_stubs, size_t n_cm_stubs)
+ struct conjunctive_match *cm_stubs,
+ unsigned int n_cm_stubs)
{
if (hmap_count(matches) > n_cm_stubs) {
struct conjunctive_match *cm, *next;
@@ -1030,7 +1031,7 @@ classifier_lookup__(const struct classifier *cls, cls_version_t version,
* we refer to these as "soft matches". */
struct cls_conjunction_set *soft_stub[64];
struct cls_conjunction_set **soft = soft_stub;
- size_t n_soft = 0, allocated_soft = ARRAY_SIZE(soft_stub);
+ unsigned int n_soft = 0, allocated_soft = ARRAY_SIZE(soft_stub);
int soft_pri = INT_MIN; /* n_soft ? MAX(soft[*]->priority) : INT_MIN. */
/* Synchronize for cls->n_tries and subtable->trie_plen. They can change
@@ -1535,7 +1536,7 @@ insert_subtable(struct classifier *cls, const struct minimask *mask)
int i, index = 0;
struct flow_wildcards old, new;
uint8_t prev;
- size_t count = miniflow_n_values(&mask->masks);
+ unsigned int count = miniflow_n_values(&mask->masks);
subtable = xzalloc(sizeof *subtable + MINIFLOW_VALUES_SIZE(count));
cmap_init(&subtable->rules);
@@ -1699,7 +1700,7 @@ miniflow_and_mask_matches_flow(const struct miniflow *flow,
const uint64_t *flowp = miniflow_get_values(flow);
const uint64_t *maskp = miniflow_get_values(&mask->masks);
const uint64_t *target_u64 = (const uint64_t *)target;
- size_t idx;
+ unsigned int idx;
MAP_FOR_EACH_INDEX(idx, mask->masks.tnl_map) {
if ((*flowp++ ^ target_u64[idx]) & *maskp++) {
@@ -1755,7 +1756,7 @@ miniflow_and_mask_matches_flow_wc(const struct miniflow *flow,
const uint64_t *target_u64 = (const uint64_t *)target;
uint64_t *wc_u64 = (uint64_t *)&wc->masks;
uint64_t diff;
- size_t idx;
+ unsigned int idx;
MAP_FOR_EACH_INDEX(idx, mask->masks.tnl_map) {
uint64_t msk = *maskp++;
@@ -2213,9 +2214,9 @@ minimask_get_prefix_len(const struct minimask *minimask,
static const ovs_be32 *
minimatch_get_prefix(const struct minimatch *match, const struct mf_field *mf)
{
- size_t u64_ofs = mf->flow_be32ofs / 2;
+ unsigned int idx = mf->flow_be32ofs / 2;
- return (OVS_FORCE const ovs_be32 *)miniflow_get__(match->flow, u64_ofs)
+ return (OVS_FORCE const ovs_be32 *)miniflow_get__(match->flow, idx)
+ (mf->flow_be32ofs & 1);
}
diff --git a/lib/classifier.h b/lib/classifier.h
index 889dc1e..fd2af72 100644
--- a/lib/classifier.h
+++ b/lib/classifier.h
@@ -369,7 +369,7 @@ void cls_rule_move(struct cls_rule *dst, struct cls_rule *src);
void cls_rule_destroy(struct cls_rule *);
void cls_rule_set_conjunctions(struct cls_rule *,
- const struct cls_conjunction *, size_t n);
+ const struct cls_conjunction *, unsigned int n);
bool cls_rule_equal(const struct cls_rule *, const struct cls_rule *);
void cls_rule_format(const struct cls_rule *, struct ds *);
@@ -391,12 +391,12 @@ bool classifier_set_prefix_fields(struct classifier *,
unsigned int n_trie_fields);
void classifier_insert(struct classifier *, const struct cls_rule *,
cls_version_t, const struct cls_conjunction *,
- size_t n_conjunctions);
+ unsigned int n_conjunctions);
const struct cls_rule *classifier_replace(struct classifier *,
const struct cls_rule *,
cls_version_t,
const struct cls_conjunction *,
- size_t n_conjunctions);
+ unsigned int n_conjunctions);
const struct cls_rule *classifier_remove(struct classifier *,
const struct cls_rule *);
static inline void classifier_defer(struct classifier *);
diff --git a/lib/flow.c b/lib/flow.c
index 1b7a3d5..14488d2 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -791,7 +791,7 @@ flow_zero_wildcards(struct flow *flow, const struct flow_wildcards *wildcards)
{
uint64_t *flow_u64 = (uint64_t *) flow;
const uint64_t *wc_u64 = (const uint64_t *) &wildcards->masks;
- size_t i;
+ unsigned int i;
for (i = 0; i < FLOW_U64S; i++) {
flow_u64[i] &= wc_u64[i];
@@ -1356,7 +1356,7 @@ bool
flow_wildcards_is_catchall(const struct flow_wildcards *wc)
{
const uint64_t *wc_u64 = (const uint64_t *) &wc->masks;
- size_t i;
+ unsigned int i;
for (i = 0; i < FLOW_U64S; i++) {
if (wc_u64[i]) {
@@ -1377,7 +1377,7 @@ flow_wildcards_and(struct flow_wildcards *dst,
uint64_t *dst_u64 = (uint64_t *) &dst->masks;
const uint64_t *src1_u64 = (const uint64_t *) &src1->masks;
const uint64_t *src2_u64 = (const uint64_t *) &src2->masks;
- size_t i;
+ unsigned int i;
for (i = 0; i < FLOW_U64S; i++) {
dst_u64[i] = src1_u64[i] & src2_u64[i];
@@ -1395,7 +1395,7 @@ flow_wildcards_or(struct flow_wildcards *dst,
uint64_t *dst_u64 = (uint64_t *) &dst->masks;
const uint64_t *src1_u64 = (const uint64_t *) &src1->masks;
const uint64_t *src2_u64 = (const uint64_t *) &src2->masks;
- size_t i;
+ unsigned int i;
for (i = 0; i < FLOW_U64S; i++) {
dst_u64[i] = src1_u64[i] | src2_u64[i];
@@ -1426,7 +1426,7 @@ flow_wildcards_has_extra(const struct flow_wildcards *a,
{
const uint64_t *a_u64 = (const uint64_t *) &a->masks;
const uint64_t *b_u64 = (const uint64_t *) &b->masks;
- size_t i;
+ unsigned int i;
for (i = 0; i < FLOW_U64S; i++) {
if ((a_u64[i] & b_u64[i]) != b_u64[i]) {
@@ -1445,7 +1445,7 @@ flow_equal_except(const struct flow *a, const struct flow *b,
const uint64_t *a_u64 = (const uint64_t *) a;
const uint64_t *b_u64 = (const uint64_t *) b;
const uint64_t *wc_u64 = (const uint64_t *) &wc->masks;
- size_t i;
+ unsigned int i;
for (i = 0; i < FLOW_U64S; i++) {
if ((a_u64[i] ^ b_u64[i]) & wc_u64[i]) {
@@ -1772,7 +1772,7 @@ flow_hash_in_wildcards(const struct flow *flow,
const uint64_t *wc_u64 = (const uint64_t *) &wc->masks;
const uint64_t *flow_u64 = (const uint64_t *) flow;
uint32_t hash;
- size_t i;
+ unsigned int i;
hash = basis;
for (i = 0; i < FLOW_U64S; i++) {
@@ -2252,7 +2252,7 @@ miniflow_init(struct miniflow *dst, const struct flow *src)
{
const uint64_t *src_u64 = (const uint64_t *) src;
uint64_t *dst_u64 = miniflow_values(dst);
- size_t idx;
+ unsigned int idx;
MAPS_FOR_EACH_INDEX(idx, *dst) {
*dst_u64++ = src_u64[idx];
@@ -2286,9 +2286,10 @@ miniflow_map_init(struct miniflow *flow, const struct flow *src)
* map of each from 'src'.
* Returns the size of the miniflow data. */
size_t
-miniflow_alloc(struct miniflow *dsts[], size_t n, const struct miniflow *src)
+miniflow_alloc(struct miniflow *dsts[], unsigned int n,
+ const struct miniflow *src)
{
- size_t n_values = miniflow_n_values(src);
+ unsigned int n_values = miniflow_n_values(src);
size_t data_size = MINIFLOW_VALUES_SIZE(n_values);
struct miniflow *dst = xmalloc(n * (sizeof *src + data_size));
unsigned int i;
@@ -2323,7 +2324,7 @@ miniflow_create(const struct flow *src)
* 'dst' to have inline space for 'n_values' data in 'src'. */
void
miniflow_clone(struct miniflow *dst, const struct miniflow *src,
- size_t n_values)
+ unsigned int n_values)
{
*dst = *src; /* Copy maps. */
memcpy(miniflow_values(dst), miniflow_get_values(src),
@@ -2380,7 +2381,7 @@ miniflow_equal_in_minimask(const struct miniflow *a, const struct miniflow *b,
const struct minimask *mask)
{
const uint64_t *p = miniflow_get_values(&mask->masks);
- size_t idx;
+ unsigned int idx;
MAPS_FOR_EACH_INDEX(idx, mask->masks) {
if ((miniflow_get(a, idx) ^ miniflow_get(b, idx)) & *p++) {
@@ -2399,7 +2400,7 @@ miniflow_equal_flow_in_minimask(const struct miniflow *a, const struct flow *b,
{
const uint64_t *b_u64 = (const uint64_t *) b;
const uint64_t *p = miniflow_get_values(&mask->masks);
- size_t idx;
+ unsigned int idx;
MAPS_FOR_EACH_INDEX(idx, mask->masks) {
if ((miniflow_get(a, idx) ^ b_u64[idx]) & *p++) {
@@ -2441,7 +2442,7 @@ minimask_combine(struct minimask *dst_,
const struct miniflow *b = &b_->masks;
const uint64_t *ap = miniflow_get_values(a);
const uint64_t *bp = miniflow_get_values(b);
- size_t idx;
+ unsigned int idx;
dst->tnl_map = 0;
MAP_FOR_EACH_INDEX(idx, a->tnl_map & b->tnl_map) {
@@ -2495,7 +2496,7 @@ minimask_has_extra(const struct minimask *a, const struct minimask *b)
{
const uint64_t *ap = miniflow_get_values(&a->masks);
const uint64_t *bp = miniflow_get_values(&b->masks);
- size_t idx;
+ unsigned int idx;
MAP_FOR_EACH_INDEX(idx, b->masks.tnl_map) {
uint64_t b_u64 = *bp++;
diff --git a/lib/flow.h b/lib/flow.h
index 5bc9267..df2f0a7 100644
--- a/lib/flow.h
+++ b/lib/flow.h
@@ -218,7 +218,7 @@ void flow_format(struct ds *, const struct flow *);
void flow_print(FILE *, const struct flow *);
static inline int flow_compare_3way(const struct flow *, const struct flow *);
static inline bool flow_equal(const struct flow *, const struct flow *);
-static inline size_t flow_hash(const struct flow *, uint32_t basis);
+static inline uint32_t flow_hash(const struct flow *, uint32_t basis);
void flow_set_dl_vlan(struct flow *, ovs_be16 vid);
void flow_set_vlan_vid(struct flow *, ovs_be16 vid);
@@ -265,7 +265,7 @@ flow_equal(const struct flow *a, const struct flow *b)
return !flow_compare_3way(a, b);
}
-static inline size_t
+static inline uint32_t
flow_hash(const struct flow *flow, uint32_t basis)
{
return hash_words64((const uint64_t *)flow,
@@ -441,26 +441,27 @@ struct pkt_metadata;
void miniflow_extract(struct dp_packet *packet, struct miniflow *dst);
void miniflow_map_init(struct miniflow *, const struct flow *);
void flow_wc_map(const struct flow *, struct miniflow *);
-size_t miniflow_alloc(struct miniflow *dsts[], size_t n,
+size_t miniflow_alloc(struct miniflow *dsts[], unsigned int n,
const struct miniflow *src);
void miniflow_init(struct miniflow *, const struct flow *);
void miniflow_clone(struct miniflow *, const struct miniflow *,
- size_t n_values);
+ unsigned int n_values);
struct miniflow * miniflow_create(const struct flow *);
void miniflow_expand(const struct miniflow *, struct flow *);
-static inline uint64_t flow_u64_value(const struct flow *flow, size_t index)
+static inline uint64_t flow_u64_value(const struct flow *flow,
+ unsigned int index)
{
return ((uint64_t *)flow)[index];
}
-static inline uint64_t *flow_u64_lvalue(struct flow *flow, size_t index)
+static inline uint64_t *flow_u64_lvalue(struct flow *flow, unsigned int index)
{
return &((uint64_t *)flow)[index];
}
-static inline size_t
+static inline unsigned int
miniflow_n_values(const struct miniflow *flow)
{
return count_1bits(flow->tnl_map) + count_1bits(flow->pkt_map);
@@ -582,21 +583,22 @@ mf_get_next_in_map(struct mf_for_each_in_map_aux *aux,
/* This can be used when it is known that 'u64_idx' is set in 'map'. */
static inline const uint64_t *
-miniflow_values_get__(const uint64_t *values, uint64_t map, size_t u64_idx)
+miniflow_values_get__(const uint64_t *values, uint64_t map,
+ unsigned int idx)
{
- return values + count_1bits(map & ((UINT64_C(1) << u64_idx) - 1));
+ return values + count_1bits(map & ((UINT64_C(1) << idx) - 1));
}
/* This can be used when it is known that 'u64_idx' is set in
* the map of 'mf'. */
static inline const uint64_t *
-miniflow_get__(const struct miniflow *mf, size_t u64_idx)
+miniflow_get__(const struct miniflow *mf, unsigned int idx)
{
- return OVS_LIKELY(u64_idx >= FLOW_TNL_U64S)
+ return OVS_LIKELY(idx >= FLOW_TNL_U64S)
? miniflow_values_get__(miniflow_get_values(mf)
+ count_1bits(mf->tnl_map),
- mf->pkt_map, u64_idx - FLOW_TNL_U64S)
- : miniflow_values_get__(miniflow_get_values(mf), mf->tnl_map, u64_idx);
+ mf->pkt_map, idx - FLOW_TNL_U64S)
+ : miniflow_values_get__(miniflow_get_values(mf), mf->tnl_map, idx);
}
#define MINIFLOW_IN_MAP(MF, U64_IDX) \
@@ -780,7 +782,7 @@ flow_union_with_miniflow(struct flow *dst, const struct miniflow *src)
{
uint64_t *dst_u64 = (uint64_t *) dst;
const uint64_t *p = miniflow_get_values(src);
- size_t idx;
+ unsigned int idx;
MAP_FOR_EACH_INDEX(idx, src->tnl_map) {
dst_u64[idx] |= *p++;
--
2.1.4
More information about the dev
mailing list