net: ipa: flag duplicate memory regions
authorAlex Elder <elder@linaro.org>
Wed, 9 Jun 2021 22:35:02 +0000 (17:35 -0500)
committerDavid S. Miller <davem@davemloft.net>
Wed, 9 Jun 2021 22:59:33 +0000 (15:59 -0700)
Add a test in ipa_mem_valid() to ensure no memory region is defined
more than once, using a bitmap to record each defined memory region.
Skip over undefined regions when checking (we can have any number of
those).

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ipa/ipa_mem.c

index e5ca6a2..7b79aeb 100644 (file)
@@ -217,6 +217,7 @@ static bool ipa_mem_valid_one(struct ipa *ipa, const struct ipa_mem *mem)
 /* Verify each defined memory region is valid. */
 static bool ipa_mem_valid(struct ipa *ipa, const struct ipa_mem_data *mem_data)
 {
+       DECLARE_BITMAP(regions, IPA_MEM_COUNT) = { };
        struct device *dev = &ipa->pdev->dev;
        enum ipa_mem_id mem_id;
 
@@ -229,6 +230,14 @@ static bool ipa_mem_valid(struct ipa *ipa, const struct ipa_mem_data *mem_data)
        for (mem_id = 0; mem_id < mem_data->local_count; mem_id++) {
                const struct ipa_mem *mem = &mem_data->local[mem_id];
 
+               if (mem_id == IPA_MEM_UNDEFINED)
+                       continue;
+
+               if (__test_and_set_bit(mem->id, regions)) {
+                       dev_err(dev, "duplicate memory region %u\n", mem->id);
+                       return false;
+               }
+
                /* Defined regions have non-zero size and/or canary count */
                if (mem->size || mem->canary_count) {
                        if (ipa_mem_valid_one(ipa, mem))