|
@@ -37,6 +37,7 @@ static __u64 time_get_ns(void)
|
|
|
#define PERCPU_HASH_KMALLOC (1 << 3)
|
|
|
#define LRU_HASH_PREALLOC (1 << 4)
|
|
|
#define PERCPU_LRU_HASH_PREALLOC (1 << 5)
|
|
|
+#define LPM_KMALLOC (1 << 6)
|
|
|
|
|
|
static int test_flags = ~0;
|
|
|
|
|
@@ -112,6 +113,18 @@ static void test_percpu_hash_kmalloc(int cpu)
|
|
|
cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
|
|
|
}
|
|
|
|
|
|
+static void test_lpm_kmalloc(int cpu)
|
|
|
+{
|
|
|
+ __u64 start_time;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ start_time = time_get_ns();
|
|
|
+ for (i = 0; i < MAX_CNT; i++)
|
|
|
+ syscall(__NR_gettid);
|
|
|
+ printf("%d:lpm_perf kmalloc %lld events per sec\n",
|
|
|
+ cpu, MAX_CNT * 1000000000ll / (time_get_ns() - start_time));
|
|
|
+}
|
|
|
+
|
|
|
static void loop(int cpu)
|
|
|
{
|
|
|
cpu_set_t cpuset;
|
|
@@ -137,6 +150,9 @@ static void loop(int cpu)
|
|
|
|
|
|
if (test_flags & PERCPU_LRU_HASH_PREALLOC)
|
|
|
test_percpu_lru_hash_prealloc(cpu);
|
|
|
+
|
|
|
+ if (test_flags & LPM_KMALLOC)
|
|
|
+ test_lpm_kmalloc(cpu);
|
|
|
}
|
|
|
|
|
|
static void run_perf_test(int tasks)
|
|
@@ -162,6 +178,37 @@ static void run_perf_test(int tasks)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void fill_lpm_trie(void)
|
|
|
+{
|
|
|
+ struct bpf_lpm_trie_key *key;
|
|
|
+ unsigned long value = 0;
|
|
|
+ unsigned int i;
|
|
|
+ int r;
|
|
|
+
|
|
|
+ key = alloca(sizeof(*key) + 4);
|
|
|
+ key->prefixlen = 32;
|
|
|
+
|
|
|
+ for (i = 0; i < 512; ++i) {
|
|
|
+ key->prefixlen = rand() % 33;
|
|
|
+ key->data[0] = rand() & 0xff;
|
|
|
+ key->data[1] = rand() & 0xff;
|
|
|
+ key->data[2] = rand() & 0xff;
|
|
|
+ key->data[3] = rand() & 0xff;
|
|
|
+ r = bpf_map_update_elem(map_fd[6], key, &value, 0);
|
|
|
+ assert(!r);
|
|
|
+ }
|
|
|
+
|
|
|
+ key->prefixlen = 32;
|
|
|
+ key->data[0] = 192;
|
|
|
+ key->data[1] = 168;
|
|
|
+ key->data[2] = 0;
|
|
|
+ key->data[3] = 1;
|
|
|
+ value = 128;
|
|
|
+
|
|
|
+ r = bpf_map_update_elem(map_fd[6], key, &value, 0);
|
|
|
+ assert(!r);
|
|
|
+}
|
|
|
+
|
|
|
int main(int argc, char **argv)
|
|
|
{
|
|
|
struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
|
|
@@ -182,6 +229,8 @@ int main(int argc, char **argv)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+ fill_lpm_trie();
|
|
|
+
|
|
|
run_perf_test(num_cpu);
|
|
|
|
|
|
return 0;
|