qed: rework qed_rdma_bmap_free()
authorYury Norov <yury.norov@gmail.com>
Sun, 23 Jan 2022 18:38:41 +0000 (10:38 -0800)
committerYury Norov <yury.norov@gmail.com>
Mon, 2 May 2022 13:30:39 +0000 (06:30 -0700)
qed_rdma_bmap_free() is mostly an opencoded version of printk("%*pb").
Using %*pb format simplifies the code, and helps to avoid inefficient
usage of bitmap_weight().

While here, reorganize logic to avoid calculating bmap weight if check
is false.

Signed-off-by: Yury Norov <yury.norov@gmail.com>
drivers/net/ethernet/qlogic/qed/qed_rdma.c

index 23b668de46402e570f56ecd6b37b6cc71c3d0fe6..69b0ede75cae3161fb5ae61813042697cd0c8873 100644 (file)
@@ -319,44 +319,27 @@ free_rdma_dev:
 void qed_rdma_bmap_free(struct qed_hwfn *p_hwfn,
                        struct qed_bmap *bmap, bool check)
 {
-       int weight = bitmap_weight(bmap->bitmap, bmap->max_count);
-       int last_line = bmap->max_count / (64 * 8);
-       int last_item = last_line * 8 +
-           DIV_ROUND_UP(bmap->max_count % (64 * 8), 64);
-       u64 *pmap = (u64 *)bmap->bitmap;
-       int line, item, offset;
-       u8 str_last_line[200] = { 0 };
-
-       if (!weight || !check)
+       unsigned int bit, weight, nbits;
+       unsigned long *b;
+
+       if (!check)
+               goto end;
+
+       weight = bitmap_weight(bmap->bitmap, bmap->max_count);
+       if (!weight)
                goto end;
 
        DP_NOTICE(p_hwfn,
                  "%s bitmap not free - size=%d, weight=%d, 512 bits per line\n",
                  bmap->name, bmap->max_count, weight);
 
-       /* print aligned non-zero lines, if any */
-       for (item = 0, line = 0; line < last_line; line++, item += 8)
-               if (bitmap_weight((unsigned long *)&pmap[item], 64 * 8))
+       for (bit = 0; bit < bmap->max_count; bit += 512) {
+               b =  bmap->bitmap + BITS_TO_LONGS(bit);
+               nbits = min(bmap->max_count - bit, 512U);
+
+               if (!bitmap_empty(b, nbits))
                        DP_NOTICE(p_hwfn,
-                                 "line 0x%04x: 0x%016llx 0x%016llx 0x%016llx 0x%016llx 0x%016llx 0x%016llx 0x%016llx 0x%016llx\n",
-                                 line,
-                                 pmap[item],
-                                 pmap[item + 1],
-                                 pmap[item + 2],
-                                 pmap[item + 3],
-                                 pmap[item + 4],
-                                 pmap[item + 5],
-                                 pmap[item + 6], pmap[item + 7]);
-
-       /* print last unaligned non-zero line, if any */
-       if ((bmap->max_count % (64 * 8)) &&
-           (bitmap_weight((unsigned long *)&pmap[item],
-                          bmap->max_count - item * 64))) {
-               offset = sprintf(str_last_line, "line 0x%04x: ", line);
-               for (; item < last_item; item++)
-                       offset += sprintf(str_last_line + offset,
-                                         "0x%016llx ", pmap[item]);
-               DP_NOTICE(p_hwfn, "%s\n", str_last_line);
+                                 "line 0x%04x: %*pb\n", bit / 512, nbits, b);
        }
 
 end: