All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks
@ 2021-07-22  6:54 Mahmoud Mandour
  2021-07-22  6:54 ` [PATCH v3 1/5] plugins/cache: Fixed a bug with destroying FIFO metadata Mahmoud Mandour
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Mahmoud Mandour @ 2021-07-22  6:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mahmoud Mandour, cota

Hello,

This series introduce some minor improvements/bug fixes in the cache
plugins and multicore cache modelling.

Multi-core cache modelling is handled such that for full-system
emulation, a private L1 cache is maintained to each core available to
the system. For multi-threaded userspace emulation, a static number of
cores is maintained for the overall system, and every memory access go
through one of these, even if the number of fired threads is more than
that number.

Also, raising the levels of warnings induced some warnings, this is
fixed in it's own patch.

Patches that still need review (other patches are already queued):
    1. plugins/cache: Supported multicore cache modelling
    2. docs/devel/tcg-plugins: added cores arg to cache plugin

v2 -> v3:
    1. Included the link of the patch solving the race.
    2. Fixed the title so that the series appears in Patchew.

v1 -> v2:
    1. Dropped the patch with mitigating the use-after-free bug since
    it's not needed anymore (fixed by Alex Bennée here
    <20210720232703.10650-1-alex.bennee@linaro.org> with patch name:
        tcg/plugins: implement a qemu_plugin_user_exit helper)
    2. Summed cache performance data as a post-processing step.
    3. Refactored appending core data to it's own function

Mahmoud Mandour (5):
  plugins/cache: Fixed a bug with destroying FIFO metadata
  plugins/cache: limited the scope of a mutex lock
  plugins/cache: Supported multicore cache modelling
  docs/devel/tcg-plugins: added cores arg to cache plugin
  plugins/cache: Fixed "function decl. is not a prototype" warnings

 contrib/plugins/cache.c    | 165 ++++++++++++++++++++++++++++---------
 docs/devel/tcg-plugins.rst |  13 +--
 2 files changed, 132 insertions(+), 46 deletions(-)

-- 
2.25.1



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 1/5] plugins/cache: Fixed a bug with destroying FIFO metadata
  2021-07-22  6:54 [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Mahmoud Mandour
@ 2021-07-22  6:54 ` Mahmoud Mandour
  2021-07-22  6:54 ` [PATCH v3 2/5] plugins/cache: limited the scope of a mutex lock Mahmoud Mandour
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Mahmoud Mandour @ 2021-07-22  6:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mahmoud Mandour, cota, Alex Bennée

This manifests itself when associativity degree is greater than the
number of sets and FIFO is used, otherwise it's also a memory leak
whenever FIFO was used.

Signed-off-by: Mahmoud Mandour <ma.mandourr@gmail.com>
---
 contrib/plugins/cache.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contrib/plugins/cache.c b/contrib/plugins/cache.c
index bf0d2f6097..4a71602639 100644
--- a/contrib/plugins/cache.c
+++ b/contrib/plugins/cache.c
@@ -200,7 +200,7 @@ static void fifo_destroy(Cache *cache)
 {
     int i;
 
-    for (i = 0; i < cache->assoc; i++) {
+    for (i = 0; i < cache->num_sets; i++) {
         g_queue_free(cache->sets[i].fifo_queue);
     }
 }
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 2/5] plugins/cache: limited the scope of a mutex lock
  2021-07-22  6:54 [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Mahmoud Mandour
  2021-07-22  6:54 ` [PATCH v3 1/5] plugins/cache: Fixed a bug with destroying FIFO metadata Mahmoud Mandour
@ 2021-07-22  6:54 ` Mahmoud Mandour
  2021-07-22  6:54 ` [PATCH v3 3/5] plugins/cache: Supported multicore cache modelling Mahmoud Mandour
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Mahmoud Mandour @ 2021-07-22  6:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mahmoud Mandour, cota, Alex Bennée

It's not necessary to lock the address translation portion of the
vcpu_mem_access callback.

Signed-off-by: Mahmoud Mandour <ma.mandourr@gmail.com>
---
 contrib/plugins/cache.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/contrib/plugins/cache.c b/contrib/plugins/cache.c
index 4a71602639..695fb969dc 100644
--- a/contrib/plugins/cache.c
+++ b/contrib/plugins/cache.c
@@ -355,15 +355,14 @@ static void vcpu_mem_access(unsigned int vcpu_index, qemu_plugin_meminfo_t info,
     struct qemu_plugin_hwaddr *hwaddr;
     InsnData *insn;
 
-    g_mutex_lock(&mtx);
     hwaddr = qemu_plugin_get_hwaddr(info, vaddr);
     if (hwaddr && qemu_plugin_hwaddr_is_io(hwaddr)) {
-        g_mutex_unlock(&mtx);
         return;
     }
 
     effective_addr = hwaddr ? qemu_plugin_hwaddr_phys_addr(hwaddr) : vaddr;
 
+    g_mutex_lock(&mtx);
     if (!access_cache(dcache, effective_addr)) {
         insn = (InsnData *) userdata;
         insn->dmisses++;
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 3/5] plugins/cache: Supported multicore cache modelling
  2021-07-22  6:54 [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Mahmoud Mandour
  2021-07-22  6:54 ` [PATCH v3 1/5] plugins/cache: Fixed a bug with destroying FIFO metadata Mahmoud Mandour
  2021-07-22  6:54 ` [PATCH v3 2/5] plugins/cache: limited the scope of a mutex lock Mahmoud Mandour
@ 2021-07-22  6:54 ` Mahmoud Mandour
  2021-07-22  6:54 ` [PATCH v3 4/5] docs/devel/tcg-plugins: added cores arg to cache plugin Mahmoud Mandour
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Mahmoud Mandour @ 2021-07-22  6:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mahmoud Mandour, cota, Alex Bennée

Multicore L1 cache modelling is introduced and is supported for both
full system emulation and linux-user.

For full-system emulation, L1 icache and dcache are maintained for each
available core, since this information is exposed to the plugin through
`qemu_plugin_n_vcpus()`.

For linux-user, a static number of cores is assumed (default 1 core, and
can be provided as a plugin argument `cores=N`). Every memory access
goes through one of these caches, this approach is taken as it's
somewhat akin to what happens on real setup, where a program that
dispatches more threads than the available cores, they'll thrash
each other

Signed-off-by: Mahmoud Mandour <ma.mandourr@gmail.com>
---
 contrib/plugins/cache.c | 154 +++++++++++++++++++++++++++++++---------
 1 file changed, 119 insertions(+), 35 deletions(-)

diff --git a/contrib/plugins/cache.c b/contrib/plugins/cache.c
index 695fb969dc..496d6e7d49 100644
--- a/contrib/plugins/cache.c
+++ b/contrib/plugins/cache.c
@@ -23,12 +23,6 @@ static GRand *rng;
 static int limit;
 static bool sys;
 
-static uint64_t dmem_accesses;
-static uint64_t dmisses;
-
-static uint64_t imem_accesses;
-static uint64_t imisses;
-
 enum EvictionPolicy {
     LRU,
     FIFO,
@@ -90,13 +84,22 @@ typedef struct {
     uint64_t imisses;
 } InsnData;
 
+typedef struct {
+    uint64_t dmem_accesses;
+    uint64_t dmisses;
+    uint64_t imem_accesses;
+    uint64_t imisses;
+} CoreStats;
+
 void (*update_hit)(Cache *cache, int set, int blk);
 void (*update_miss)(Cache *cache, int set, int blk);
 
 void (*metadata_init)(Cache *cache);
 void (*metadata_destroy)(Cache *cache);
 
-Cache *dcache, *icache;
+static int cores;
+CoreStats *stats;
+Cache **dcaches, **icaches;
 
 static int pow_of_two(int num)
 {
@@ -233,14 +236,16 @@ static bool bad_cache_params(int blksize, int assoc, int cachesize)
 
 static Cache *cache_init(int blksize, int assoc, int cachesize)
 {
-    if (bad_cache_params(blksize, assoc, cachesize)) {
-        return NULL;
-    }
-
     Cache *cache;
     int i;
     uint64_t blk_mask;
 
+    /*
+     * This function shall not be called directly, and hence expects suitable
+     * parameters.
+     */
+    g_assert(!bad_cache_params(blksize, assoc, cachesize));
+
     cache = g_new(Cache, 1);
     cache->assoc = assoc;
     cache->cachesize = cachesize;
@@ -263,6 +268,24 @@ static Cache *cache_init(int blksize, int assoc, int cachesize)
     return cache;
 }
 
+static Cache **caches_init(int blksize, int assoc, int cachesize)
+{
+    Cache **caches;
+    int i;
+
+    if (bad_cache_params(blksize, assoc, cachesize)) {
+        return NULL;
+    }
+
+    caches = g_new(Cache *, cores);
+
+    for (i = 0; i < cores; i++) {
+        caches[i] = cache_init(blksize, assoc, cachesize);
+    }
+
+    return caches;
+}
+
 static int get_invalid_block(Cache *cache, uint64_t set)
 {
     int i;
@@ -353,6 +376,7 @@ static void vcpu_mem_access(unsigned int vcpu_index, qemu_plugin_meminfo_t info,
 {
     uint64_t effective_addr;
     struct qemu_plugin_hwaddr *hwaddr;
+    int cache_idx;
     InsnData *insn;
 
     hwaddr = qemu_plugin_get_hwaddr(info, vaddr);
@@ -361,14 +385,15 @@ static void vcpu_mem_access(unsigned int vcpu_index, qemu_plugin_meminfo_t info,
     }
 
     effective_addr = hwaddr ? qemu_plugin_hwaddr_phys_addr(hwaddr) : vaddr;
+    cache_idx = vcpu_index % cores;
 
     g_mutex_lock(&mtx);
-    if (!access_cache(dcache, effective_addr)) {
+    if (!access_cache(dcaches[cache_idx], effective_addr)) {
         insn = (InsnData *) userdata;
         insn->dmisses++;
-        dmisses++;
+        stats[cache_idx].dmisses++;
     }
-    dmem_accesses++;
+    stats[cache_idx].dmem_accesses++;
     g_mutex_unlock(&mtx);
 }
 
@@ -376,16 +401,18 @@ static void vcpu_insn_exec(unsigned int vcpu_index, void *userdata)
 {
     uint64_t insn_addr;
     InsnData *insn;
+    int cache_idx;
 
     g_mutex_lock(&mtx);
     insn_addr = ((InsnData *) userdata)->addr;
+    cache_idx = vcpu_index % cores;
 
-    if (!access_cache(icache, insn_addr)) {
+    if (!access_cache(icaches[cache_idx], insn_addr)) {
         insn = (InsnData *) userdata;
         insn->imisses++;
-        imisses++;
+        stats[cache_idx].imisses++;
     }
-    imem_accesses++;
+    stats[cache_idx].imem_accesses++;
     g_mutex_unlock(&mtx);
 }
 
@@ -453,6 +480,15 @@ static void cache_free(Cache *cache)
     g_free(cache);
 }
 
+static void caches_free(Cache **caches)
+{
+    int i;
+
+    for (i = 0; i < cores; i++) {
+        cache_free(caches[i]);
+    }
+}
+
 static int dcmp(gconstpointer a, gconstpointer b)
 {
     InsnData *insn_a = (InsnData *) a;
@@ -469,21 +505,57 @@ static int icmp(gconstpointer a, gconstpointer b)
     return insn_a->imisses < insn_b->imisses ? 1 : -1;
 }
 
+static void append_stats_line(GString *line, CoreStats cs)
+{
+    double dmiss_rate, imiss_rate;
+
+    dmiss_rate = ((double) cs.dmisses) / (cs.dmem_accesses) * 100.0;
+    imiss_rate = ((double) cs.imisses) / (cs.imem_accesses) * 100.0;
+
+    g_string_append_printf(line, "%-14lu %-12lu %9.4lf%%  %-14lu %-12lu"
+                           " %9.4lf%%\n",
+                           cs.dmem_accesses,
+                           cs.dmisses,
+                           cs.dmem_accesses ? dmiss_rate : 0.0,
+                           cs.imem_accesses,
+                           cs.imisses,
+                           cs.imem_accesses ? imiss_rate : 0.0);
+}
+
+static void sum_stats(void)
+{
+    int i;
+
+    g_assert(cores > 1);
+    for (i = 0; i < cores; i++) {
+        stats[cores].imisses += stats[i].imisses;
+        stats[cores].dmisses += stats[i].dmisses;
+        stats[cores].dmem_accesses += stats[i].dmem_accesses;
+        stats[cores].imem_accesses += stats[i].imem_accesses;
+    }
+}
+
 static void log_stats()
 {
-    g_autoptr(GString) rep = g_string_new("");
-    g_string_append_printf(rep,
-        "Data accesses: %lu, Misses: %lu\nMiss rate: %lf%%\n\n",
-        dmem_accesses,
-        dmisses,
-        ((double) dmisses / (double) dmem_accesses) * 100.0);
-
-    g_string_append_printf(rep,
-        "Instruction accesses: %lu, Misses: %lu\nMiss rate: %lf%%\n\n",
-        imem_accesses,
-        imisses,
-        ((double) imisses / (double) imem_accesses) * 100.0);
+    int i, iters;
+
+    g_autoptr(GString) rep = g_string_new("core #, data accesses, data misses,"
+                                          " dmiss rate, insn accesses,"
+                                          " insn misses, imiss rate\n");
+
+    /* Only iterate and print a sum row if cores > 1 */
+    iters = cores == 1 ? 1 : cores + 1;
+    for (i = 0; i < iters; i++) {
+        if (i == cores) {
+            g_string_append_printf(rep, "%-8s", "sum");
+            sum_stats();
+        } else {
+            g_string_append_printf(rep, "%-8d", i);
+        }
+        append_stats_line(rep, stats[i]);
+    }
 
+    g_string_append(rep, "\n");
     qemu_plugin_outs(rep->str);
 }
 
@@ -530,10 +602,12 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
     log_stats();
     log_top_insns();
 
-    cache_free(dcache);
-    cache_free(icache);
+    caches_free(dcaches);
+    caches_free(icaches);
 
     g_hash_table_destroy(miss_ht);
+
+    g_free(stats);
 }
 
 static void policy_init()
@@ -579,6 +653,8 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
 
     policy = LRU;
 
+    cores = sys ? qemu_plugin_n_vcpus() : 1;
+
     for (i = 0; i < argc; i++) {
         char *opt = argv[i];
         if (g_str_has_prefix(opt, "iblksize=")) {
@@ -595,6 +671,8 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
             dcachesize = g_ascii_strtoll(opt + 11, NULL, 10);
         } else if (g_str_has_prefix(opt, "limit=")) {
             limit = g_ascii_strtoll(opt + 6, NULL, 10);
+        } else if (g_str_has_prefix(opt, "cores=")) {
+            cores = g_ascii_strtoll(opt + 6, NULL, 10);
         } else if (g_str_has_prefix(opt, "evict=")) {
             gchar *p = opt + 6;
             if (g_strcmp0(p, "rand") == 0) {
@@ -615,22 +693,28 @@ int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
 
     policy_init();
 
-    dcache = cache_init(dblksize, dassoc, dcachesize);
-    if (!dcache) {
+    dcaches = caches_init(dblksize, dassoc, dcachesize);
+    if (!dcaches) {
         const char *err = cache_config_error(dblksize, dassoc, dcachesize);
         fprintf(stderr, "dcache cannot be constructed from given parameters\n");
         fprintf(stderr, "%s\n", err);
         return -1;
     }
 
-    icache = cache_init(iblksize, iassoc, icachesize);
-    if (!icache) {
+    icaches = caches_init(iblksize, iassoc, icachesize);
+    if (!icaches) {
         const char *err = cache_config_error(iblksize, iassoc, icachesize);
         fprintf(stderr, "icache cannot be constructed from given parameters\n");
         fprintf(stderr, "%s\n", err);
         return -1;
     }
 
+    /*
+     * plus one to save the sum in. If only one core is used then no need to
+     * get an auxiliary struct.
+     */
+    stats = g_new0(CoreStats, cores == 1 ? 1 : cores + 1);
+
     qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
     qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
 
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 4/5] docs/devel/tcg-plugins: added cores arg to cache plugin
  2021-07-22  6:54 [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Mahmoud Mandour
                   ` (2 preceding siblings ...)
  2021-07-22  6:54 ` [PATCH v3 3/5] plugins/cache: Supported multicore cache modelling Mahmoud Mandour
@ 2021-07-22  6:54 ` Mahmoud Mandour
  2021-07-22  6:54 ` [PATCH v3 5/5] plugins/cache: Fixed "function decl. is not a prototype" warnings Mahmoud Mandour
  2021-08-02 11:24 ` [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Alex Bennée
  5 siblings, 0 replies; 7+ messages in thread
From: Mahmoud Mandour @ 2021-07-22  6:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mahmoud Mandour, cota, Alex Bennée

Signed-off-by: Mahmoud Mandour <ma.mandourr@gmail.com>
---
 docs/devel/tcg-plugins.rst | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
index 595b8e0ea4..370c11373f 100644
--- a/docs/devel/tcg-plugins.rst
+++ b/docs/devel/tcg-plugins.rst
@@ -330,11 +330,8 @@ configuration when a given working set is run::
 
 will report the following::
 
-    Data accesses: 996479, Misses: 507
-    Miss rate: 0.050879%
-
-    Instruction accesses: 2641737, Misses: 18617
-    Miss rate: 0.704726%
+    core #, data accesses, data misses, dmiss rate, insn accesses, insn misses, imiss rate
+    0       996695         508             0.0510%  2642799        18617           0.7044%
 
     address, data misses, instruction
     0x424f1e (_int_malloc), 109, movq %rax, 8(%rcx)
@@ -378,3 +375,9 @@ The plugin has a number of arguments, all of them are optional:
   Sets the eviction policy to POLICY. Available policies are: :code:`lru`,
   :code:`fifo`, and :code:`rand`. The plugin will use the specified policy for
   both instruction and data caches. (default: POLICY = :code:`lru`)
+
+  * arg="cores=N"
+
+  Sets the number of cores for which we maintain separate icache and dcache.
+  (default: for linux-user, N = 1, for full system emulation: N = cores
+  available to guest)
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 5/5] plugins/cache: Fixed "function decl. is not a prototype" warnings
  2021-07-22  6:54 [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Mahmoud Mandour
                   ` (3 preceding siblings ...)
  2021-07-22  6:54 ` [PATCH v3 4/5] docs/devel/tcg-plugins: added cores arg to cache plugin Mahmoud Mandour
@ 2021-07-22  6:54 ` Mahmoud Mandour
  2021-08-02 11:24 ` [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Alex Bennée
  5 siblings, 0 replies; 7+ messages in thread
From: Mahmoud Mandour @ 2021-07-22  6:54 UTC (permalink / raw)
  To: qemu-devel; +Cc: Mahmoud Mandour, cota, Alex Bennée

Signed-off-by: Mahmoud Mandour <ma.mandourr@gmail.com>
---
 contrib/plugins/cache.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/contrib/plugins/cache.c b/contrib/plugins/cache.c
index 496d6e7d49..cc9020b2d5 100644
--- a/contrib/plugins/cache.c
+++ b/contrib/plugins/cache.c
@@ -535,7 +535,7 @@ static void sum_stats(void)
     }
 }
 
-static void log_stats()
+static void log_stats(void)
 {
     int i, iters;
 
@@ -559,7 +559,7 @@ static void log_stats()
     qemu_plugin_outs(rep->str);
 }
 
-static void log_top_insns()
+static void log_top_insns(void)
 {
     int i;
     GList *curr, *miss_insns;
@@ -610,7 +610,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
     g_free(stats);
 }
 
-static void policy_init()
+static void policy_init(void)
 {
     switch (policy) {
     case LRU:
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks
  2021-07-22  6:54 [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Mahmoud Mandour
                   ` (4 preceding siblings ...)
  2021-07-22  6:54 ` [PATCH v3 5/5] plugins/cache: Fixed "function decl. is not a prototype" warnings Mahmoud Mandour
@ 2021-08-02 11:24 ` Alex Bennée
  5 siblings, 0 replies; 7+ messages in thread
From: Alex Bennée @ 2021-08-02 11:24 UTC (permalink / raw)
  To: Mahmoud Mandour; +Cc: cota, qemu-devel


Mahmoud Mandour <ma.mandourr@gmail.com> writes:

> Hello,
>
> This series introduce some minor improvements/bug fixes in the cache
> plugins and multicore cache modelling.
>
> Multi-core cache modelling is handled such that for full-system
> emulation, a private L1 cache is maintained to each core available to
> the system. For multi-threaded userspace emulation, a static number of
> cores is maintained for the overall system, and every memory access go
> through one of these, even if the number of fired threads is more than
> that number.
>
> Also, raising the levels of warnings induced some warnings, this is
> fixed in it's own patch.
>
> Patches that still need review (other patches are already queued):
>     1. plugins/cache: Supported multicore cache modelling
>     2. docs/devel/tcg-plugins: added cores arg to cache plugin

Could you re-base this onto the current master please? I skipped the
patches already merged but still couldn't get the series to cleanly
apply.

-- 
Alex Bennée


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-08-02 11:26 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-22  6:54 [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Mahmoud Mandour
2021-07-22  6:54 ` [PATCH v3 1/5] plugins/cache: Fixed a bug with destroying FIFO metadata Mahmoud Mandour
2021-07-22  6:54 ` [PATCH v3 2/5] plugins/cache: limited the scope of a mutex lock Mahmoud Mandour
2021-07-22  6:54 ` [PATCH v3 3/5] plugins/cache: Supported multicore cache modelling Mahmoud Mandour
2021-07-22  6:54 ` [PATCH v3 4/5] docs/devel/tcg-plugins: added cores arg to cache plugin Mahmoud Mandour
2021-07-22  6:54 ` [PATCH v3 5/5] plugins/cache: Fixed "function decl. is not a prototype" warnings Mahmoud Mandour
2021-08-02 11:24 ` [PATCH v3 0/5] plugins/cache: multicore cache modelling and minor tweaks Alex Bennée

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.