aboutsummaryrefslogtreecommitdiffstats
path: root/bootstrap-verify-perf.sh
AgeCommit message (Expand)AuthorFilesLines
2016-11-04CSIT-461 Fix VPP version variable in perf bootstrappmikus1-6/+8
2016-08-31CSIT-387 collect HW stats if binary search failsMiroslav Miklus1-7/+8
2016-08-22CSIT-370 use LATEST instead of STABLEMiroslav Miklus1-9/+21
2016-08-15CSIT-226: Install vpp-plugins deb package on DUTMatej Klotton1-0/+1
2016-08-09Make all perf tests CRITICALMiroslav Miklus1-1/+1
2016-08-02CSIT-311 New Nightly CSIT perf jobMiroslav Miklus1-1/+11
2016-08-01CSIT-310 Use multi-NIC topology filesMiroslav Miklus1-3/+3
2016-07-22CSIT-220: Rename directories in tests directoryMatej Klotton1-8/+10
2016-07-15Use vpp 16.09-rc0~233-gad2c9c0~b404 packageMiroslav Miklus1-12/+13
2016-07-15CSIT-106 Introduced SKIP_PATCH tag in perf suiteMiroslav Miklus1-1/+1
2016-07-01TEST: PERF pybot output set width to 150 charactersMiroslav Miklus1-1/+1
2016-06-27Mark all PERF tests as noncriticalMiroslav Miklus1-2/+1
2016-06-21Change VPP repo URLpmikus1-1/+1
2016-06-17Change VPP repo URLpmikus1-1/+1
2016-06-11Process output of robot to XML file for Plot pluginpmikus1-2/+4
2016-06-10VPP startup config change (rss->txqueues)Miroslav Miklus1-2/+2
2016-06-02CSIT-114: Eliminate repeated download of PIP packagesCarsten Koester1-1/+1
2016-05-31PATCH: Return pybot exit code in bootstrap-verify-perfPeter Mikus1-0/+13
2016-05-26Find PDR using binary searchPeter Mikus1-0/+13
2016-05-26Rename topology files with correct NIC namesMiroslav Miklus1-3/+3
2016-05-23Performance l2-vlan-dot1q library and short/long test casespmikus1-0/+7
2016-05-22TB3 topology file with X520-DA2 NICsMiroslav Miklus1-1/+2
2016-05-19TB1 topology file with X520-DA2 NICs onlyMiroslav Miklus1-1/+3
2016-05-19Parse robot output.xml for performance reportingpmikus1-0/+17
2016-05-18PERF bootstrap, apply global PYBOT args to all test typesMiroslav Miklus1-6/+12
2016-05-18Explicitly list the NIC type for perf testsMiroslav Miklus1-4/+4
2016-05-12Update of vpp build for perf testsMiroslav Miklus1-1/+1
2016-05-11Performance IPv6 library and short/long test casespmikus1-0/+6
2016-05-06Extend testbed reservation wait timeMiroslav Miklus1-2/+2
2016-05-02Topo installation script fixMiroslav Miklus1-2/+2
2016-04-27Installation of stable vpp version for csit-vpp-perf-hw-all jenkins jobMiroslav Miklus1-13/+71
2016-04-12Boostrap verify installation directory removalpmikus1-1/+1
2016-04-12Bootstrap verify performance fixpmikus1-10/+12
2016-04-12Bootstrap verify perfomance fixpmikus1-1/+1
2016-04-05Add tag support to boostrap-verify-perfpmikus1-4/+12
2016-04-01Bootstrap to test perf of proposed patch vpp-csit-hw-perfpmikus1-0/+82
span class="o">- 4); n_left = 4; } if (n_left > 0) a += load_partial_u32 (d32 + 0, n_left - 0); hash_v3_finalize32 (a, b, c); return c; } #define foreach_mhash_key_size \ _ (2) _ (3) _ (4) _ (5) _ (6) _ (7) \ _ (8) _ (12) _ (16) _ (20) \ _ (24) _ (28) _ (32) _ (36) \ _ (40) _ (44) _ (48) _ (52) \ _ (56) _ (60) _ (64) #define _(N_KEY_BYTES) \ static uword \ mhash_key_sum_##N_KEY_BYTES (hash_t * h, uword key) \ { \ mhash_t * hv = uword_to_pointer (h->user, mhash_t *); \ return mhash_key_sum_inline (mhash_key_to_mem (hv, key), \ (N_KEY_BYTES), \ hv->hash_seed); \ } \ \ static uword \ mhash_key_equal_##N_KEY_BYTES (hash_t * h, uword key1, uword key2) \ { \ mhash_t * hv = uword_to_pointer (h->user, mhash_t *); \ void * k1 = mhash_key_to_mem (hv, key1); \ void * k2 = mhash_key_to_mem (hv, key2); \ return ! memcmp (k1, k2, (N_KEY_BYTES)); \ } foreach_mhash_key_size #undef _ static uword mhash_key_sum_c_string (hash_t * h, uword key) { mhash_t *hv = uword_to_pointer (h->user, mhash_t *); void *k = mhash_key_to_mem (hv, key); return mhash_key_sum_inline (k, strlen (k), hv->hash_seed); } static uword mhash_key_equal_c_string (hash_t * h, uword key1, uword key2) { mhash_t *hv = uword_to_pointer (h->user, mhash_t *); void *k1 = mhash_key_to_mem (hv, key1); void *k2 = mhash_key_to_mem (hv, key2); return strcmp (k1, k2) == 0; } static uword mhash_key_sum_vec_string (hash_t * h, uword key) { mhash_t *hv = uword_to_pointer (h->user, mhash_t *); void *k = mhash_key_to_mem (hv, key); return mhash_key_sum_inline (k, vec_len (k), hv->hash_seed); } static uword mhash_key_equal_vec_string (hash_t * h, uword key1, uword key2) { mhash_t *hv = uword_to_pointer (h->user, mhash_t *); void *k1 = mhash_key_to_mem (hv, key1); void *k2 = mhash_key_to_mem (hv, key2); return vec_len (k1) == vec_len (k2) && memcmp (k1, k2, vec_len (k1)) == 0; } /* The CLIB hash user pointer must always point to a valid mhash_t. Now, the address of mhash_t can change (think vec_resize). So we must always be careful that it points to the correct address. */ always_inline void mhash_sanitize_hash_user (mhash_t * mh) { uword *hash = mh->hash; hash_t *h = hash_header (hash); h->user = pointer_to_uword (mh); } void mhash_init (mhash_t * h, uword n_value_bytes, uword n_key_bytes) { static struct { hash_key_sum_function_t *key_sum; hash_key_equal_function_t *key_equal; } t[] = { #define _(N_KEY_BYTES) \ [N_KEY_BYTES] = { \ .key_sum = mhash_key_sum_##N_KEY_BYTES, \ .key_equal = mhash_key_equal_##N_KEY_BYTES, \ }, foreach_mhash_key_size #undef _ [MHASH_C_STRING_KEY] = { .key_sum = mhash_key_sum_c_string,.key_equal = mhash_key_equal_c_string,}, [MHASH_VEC_STRING_KEY] = { .key_sum = mhash_key_sum_vec_string,.key_equal = mhash_key_equal_vec_string,},}; if (mhash_key_vector_is_heap (h)) heap_free (h->key_vector_or_heap); else vec_free (h->key_vector_or_heap); vec_free (h->key_vector_free_indices); { int i; for (i = 0; i < vec_len (h->key_tmps); i++) vec_free (h->key_tmps[i]); } vec_free (h->key_tmps); hash_free (h->hash); clib_memset (h, 0, sizeof (h[0])); h->n_key_bytes = n_key_bytes; #if 0 if (h->n_key_bytes > 0) { vec_validate (h->key_tmp, h->n_key_bytes - 1); _vec_len (h->key_tmp) = 0; } #endif ASSERT (n_key_bytes < ARRAY_LEN (t)); h->hash = hash_create2 ( /* elts */ 0, /* user */ pointer_to_uword (h), /* value_bytes */ n_value_bytes, t[n_key_bytes].key_sum, t[n_key_bytes].key_equal, /* format pair/arg */ 0, 0); } static uword mhash_set_tmp_key (mhash_t * h, const void *key) { u8 *key_tmp; int my_cpu = os_get_thread_index (); vec_validate (h->key_tmps, my_cpu); key_tmp = h->key_tmps[my_cpu]; vec_reset_length (key_tmp); if (mhash_key_vector_is_heap (h)) { uword is_c_string = h->n_key_bytes == MHASH_C_STRING_KEY; if (is_c_string) vec_add (key_tmp, key, strlen (key) + 1); else vec_add (key_tmp, key, vec_len (key)); } else vec_add (key_tmp, key, h->n_key_bytes); h->key_tmps[my_cpu] = key_tmp; return ~0; } hash_pair_t * mhash_get_pair (mhash_t * h, const void *key) { uword ikey; mhash_sanitize_hash_user (h); ikey = mhash_set_tmp_key (h, key); return hash_get_pair (h->hash, ikey); } typedef struct { u32 heap_handle; /* Must coincide with vec_header. */ vec_header_t vec; } mhash_string_key_t; uword mhash_set_mem (mhash_t * h, void *key, uword * new_value, uword * old_value) { u8 *k; uword ikey, i, l = 0, n_key_bytes, old_n_elts, key_alloc_from_free_list = 0; mhash_sanitize_hash_user (h); if (mhash_key_vector_is_heap (h)) { mhash_string_key_t *sk; uword is_c_string = h->n_key_bytes == MHASH_C_STRING_KEY; uword handle; n_key_bytes = is_c_string ? (strlen (key) + 1) : vec_len (key); i = heap_alloc (h->key_vector_or_heap, n_key_bytes + sizeof (sk[0]), handle); sk = (void *) (h->key_vector_or_heap + i); sk->heap_handle = handle; sk->vec.len = n_key_bytes; clib_memcpy (sk->vec.vector_data, key, n_key_bytes); /* Advance key past vector header. */ i += sizeof (sk[0]); } else { key_alloc_from_free_list = (l = vec_len (h->key_vector_free_indices)) > 0; if (key_alloc_from_free_list) { i = h->key_vector_free_indices[l - 1]; k = vec_elt_at_index (h->key_vector_or_heap, i); _vec_len (h->key_vector_free_indices) = l - 1; } else { vec_add2 (h->key_vector_or_heap, k, h->n_key_bytes); i = k - h->key_vector_or_heap; } n_key_bytes = h->n_key_bytes; clib_memcpy (k, key, n_key_bytes); } ikey = i; old_n_elts = hash_elts (h->hash); h->hash = _hash_set3 (h->hash, ikey, new_value, old_value); /* If element already existed remove duplicate key. */ if (hash_elts (h->hash) == old_n_elts) { hash_pair_t *p; /* Fetch old key for return value. */ p = hash_get_pair (h->hash, ikey); ikey = p->key; /* Remove duplicate key. */ if (mhash_key_vector_is_heap (h)) { mhash_string_key_t *sk; sk = (void *) (h->key_vector_or_heap + i - sizeof (sk[0])); heap_dealloc (h->key_vector_or_heap, sk->heap_handle); } else { if (key_alloc_from_free_list) { h->key_vector_free_indices[l] = i; _vec_len (h->key_vector_free_indices) = l + 1; } else _vec_len (h->key_vector_or_heap) -= h->n_key_bytes; } } return ikey; } uword mhash_unset (mhash_t * h, void *key, uword * old_value) { hash_pair_t *p; uword i; mhash_sanitize_hash_user (h); i = mhash_set_tmp_key (h, key); p = hash_get_pair (h->hash, i); if (!p) return 0; ASSERT (p->key != ~0); i = p->key; if (mhash_key_vector_is_heap (h)) { mhash_string_key_t *sk; sk = (void *) (h->key_vector_or_heap + i) - sizeof (sk[0]); heap_dealloc (h->key_vector_or_heap, sk->heap_handle); } else vec_add1 (h->key_vector_free_indices, i); hash_unset3 (h->hash, i, old_value); return 1; } u8 * format_mhash_key (u8 * s, va_list * va) { mhash_t *h = va_arg (*va, mhash_t *); u32 ki = va_arg (*va, u32); void *k = mhash_key_to_mem (h, ki); if (mhash_key_vector_is_heap (h)) { uword is_c_string = h->n_key_bytes == MHASH_C_STRING_KEY; u32 l = is_c_string ? strlen (k) : vec_len (k); vec_add (s, k, l); } else if (h->format_key) s = format (s, "%U", h->format_key, k); else s = format (s, "%U", format_hex_bytes, k, h->n_key_bytes); return s; } /* * fd.io coding-style-patch-verification: ON * * Local Variables: * eval: (c-set-style "gnu") * End: */