Thread (13 messages) flat view 13 messages, 3 authors, 2015-03-27

Re: [PATCH 1/5] of: unittest: overlay: Keep track of created overlays

From: Pantelis Antoniou <hidden>
Date: 2015-03-27 18:24:47
Also in: linux-devicetree, lkml

Hi Rob,
On Mar 24, 2015, at 21:53 , Rob Herring [off-list ref] wrote:

On Tue, Mar 17, 2015 at 3:30 PM, Pantelis Antoniou
[off-list ref] wrote:
quoted
During the course of the overlay selftests some of them remain
applied. While this does not pose a real problem, make sure you track
them and destroy them at the end of the test.
This is going to need to be rebased on my tree as there has been some
selftest->unitest renaming.
Ok, will do so first thing next week.
Rob
Regards

— Pantelis
quoted
Signed-off-by: Pantelis Antoniou <redacted>
---
drivers/of/unittest.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index 4e60682..c711534 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -23,6 +23,8 @@
#include <linux/i2c.h>
#include <linux/i2c-mux.h>

+#include <linux/bitops.h>
+
#include "of_private.h"

static struct selftest_results {
@@ -1115,6 +1117,59 @@ static const char *overlay_path(int nr)
static const char *bus_path = "/testcase-data/overlay-node/test-bus";

+/* it is guaranteed that overlay ids are assigned in sequence */
+#define MAX_SELFTEST_OVERLAYS  256
+static unsigned long overlay_id_bits[BITS_TO_LONGS(MAX_SELFTEST_OVERLAYS)];
+static int overlay_first_id = -1;
+
+static void of_selftest_track_overlay(int id)
+{
+       if (overlay_first_id < 0)
+               overlay_first_id = id;
+       id -= overlay_first_id;
+
+       /* we shouldn't need that many */
+       BUG_ON(id >= MAX_SELFTEST_OVERLAYS);
+       overlay_id_bits[BIT_WORD(id)] |= BIT_MASK(id);
+}
+
+static void of_selftest_untrack_overlay(int id)
+{
+       if (overlay_first_id < 0)
+               return;
+       id -= overlay_first_id;
+       BUG_ON(id >= MAX_SELFTEST_OVERLAYS);
+       overlay_id_bits[BIT_WORD(id)] &= ~BIT_MASK(id);
+}
+
+static void of_selftest_destroy_tracked_overlays(void)
+{
+       int id, ret, defers;
+
+       if (overlay_first_id < 0)
+               return;
+
+       /* try until no defers */
+       do {
+               defers = 0;
+               /* remove in reverse order */
+               for (id = MAX_SELFTEST_OVERLAYS - 1; id >= 0; id--) {
+                       if (!(overlay_id_bits[BIT_WORD(id)] & BIT_MASK(id)))
+                               continue;
+
+                       ret = of_overlay_destroy(id + overlay_first_id);
+                       if (ret != 0) {
+                               defers++;
+                               pr_warn("%s: overlay destroy failed for #%d\n",
+                                       __func__, id + overlay_first_id);
+                               continue;
+                       }
+
+                       overlay_id_bits[BIT_WORD(id)] &= ~BIT_MASK(id);
+               }
+       } while (defers > 0);
+}
+
static int of_selftest_apply_overlay(int selftest_nr, int overlay_nr,
               int *overlay_id)
{
@@ -1136,6 +1191,7 @@ static int of_selftest_apply_overlay(int selftest_nr, int overlay_nr,
               goto out;
       }
       id = ret;
+       of_selftest_track_overlay(id);

       ret = 0;
@@ -1349,6 +1405,7 @@ static void of_selftest_overlay_6(void)
                       return;
               }
               ov_id[i] = ret;
+               of_selftest_track_overlay(ov_id[i]);
       }

       for (i = 0; i < 2; i++) {
@@ -1373,6 +1430,7 @@ static void of_selftest_overlay_6(void)
                                               PDEV_OVERLAY));
                       return;
               }
+               of_selftest_untrack_overlay(ov_id[i]);
       }

       for (i = 0; i < 2; i++) {
@@ -1417,6 +1475,7 @@ static void of_selftest_overlay_8(void)
                       return;
               }
               ov_id[i] = ret;
+               of_selftest_track_overlay(ov_id[i]);
       }

       /* now try to remove first overlay (it should fail) */
@@ -1439,6 +1498,7 @@ static void of_selftest_overlay_8(void)
                                               PDEV_OVERLAY));
                       return;
               }
+               of_selftest_untrack_overlay(ov_id[i]);
       }

       selftest(1, "overlay test %d passed\n", 8);
@@ -1861,6 +1921,8 @@ static void __init of_selftest_overlay(void)
       of_selftest_overlay_i2c_cleanup();
#endif

+       of_selftest_destroy_tracked_overlays();
+
out:
       of_node_put(bus_np);
}
--
1.7.12
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help