Whamcloud - gitweb
LU-9859 lod: use linux kernel bitmap API 76/39876/2
authorJames Simmons <jsimmons@infradead.org>
Thu, 10 Sep 2020 14:35:55 +0000 (10:35 -0400)
committerOleg Drokin <green@whamcloud.com>
Fri, 26 Feb 2021 21:05:47 +0000 (21:05 +0000)
Now that modern Linux kernels support a bitmap API we can move
away from the libcfs specific bitmap API. This patch changes
the last bitmap in the lod module to use the Linux kernel
bitmap API.

Change-Id: I92c494bf2af62e31d7b9527b3f44580322e48fd3
Signed-off-by: James Simmons <jsimmons@infradead.org>
Reviewed-on: https://review.whamcloud.com/39876
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Yang Sheng <ys@whamcloud.com>
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lod/lod_dev.c
lustre/lod/lod_internal.h
lustre/lod/lod_qos.c

index 86cb84e..c8ec185 100644 (file)
@@ -1888,8 +1888,7 @@ static void lod_avoid_guide_fini(struct lod_avoid_guide *lag)
        if (lag->lag_oss_avoid_array)
                OBD_FREE_PTR_ARRAY(lag->lag_oss_avoid_array,
                                   lag->lag_oaa_size);
        if (lag->lag_oss_avoid_array)
                OBD_FREE_PTR_ARRAY(lag->lag_oss_avoid_array,
                                   lag->lag_oaa_size);
-       if (lag->lag_ost_avoid_bitmap)
-               CFS_FREE_BITMAP(lag->lag_ost_avoid_bitmap);
+       bitmap_free(lag->lag_ost_avoid_bitmap);
 }
 
 /**
 }
 
 /**
index 4bf037b..68d890d 100644 (file)
@@ -87,7 +87,8 @@ struct lod_avoid_guide {
        /* number of allocated array items */
        unsigned int            lag_oaa_size;
        /* bitmap of OSTs avoid guidance */
        /* number of allocated array items */
        unsigned int            lag_oaa_size;
        /* bitmap of OSTs avoid guidance */
-       struct cfs_bitmap       *lag_ost_avoid_bitmap;
+       unsigned long           *lag_ost_avoid_bitmap;
+       u32                     lag_ost_avoid_size;
        /* how many OSTs are available for alloc */
        __u32                   lag_ost_avail;
 };
        /* how many OSTs are available for alloc */
        __u32                   lag_ost_avail;
 };
index e1c590c..f4a7783 100644 (file)
@@ -607,7 +607,7 @@ static inline bool lod_should_avoid_ost(struct lod_object *lo,
                return false;
 
        /* if the OSS has been used, check whether the OST has been used */
                return false;
 
        /* if the OSS has been used, check whether the OST has been used */
-       if (!cfs_bitmap_check(lag->lag_ost_avoid_bitmap, index))
+       if (!test_bit(index, lag->lag_ost_avoid_bitmap))
                used = false;
        else
                QOS_DEBUG("OST%d: been used in conflicting mirror component\n",
                used = false;
        else
                QOS_DEBUG("OST%d: been used in conflicting mirror component\n",
@@ -2320,7 +2320,7 @@ int lod_prepare_avoidance(const struct lu_env *env, struct lod_object *lo)
 {
        struct lod_device *lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
        struct lod_avoid_guide *lag = &lod_env_info(env)->lti_avoid;
 {
        struct lod_device *lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
        struct lod_avoid_guide *lag = &lod_env_info(env)->lti_avoid;
-       struct cfs_bitmap *bitmap = NULL;
+       unsigned long *bitmap = NULL;
        __u32 *new_oss = NULL;
 
        lag->lag_ost_avail = lod->lod_ost_count;
        __u32 *new_oss = NULL;
 
        lag->lag_ost_avail = lod->lod_ost_count;
@@ -2336,16 +2336,17 @@ int lod_prepare_avoidance(const struct lu_env *env, struct lod_object *lo)
 
        /* init OST avoid guide bitmap */
        if (lag->lag_ost_avoid_bitmap) {
 
        /* init OST avoid guide bitmap */
        if (lag->lag_ost_avoid_bitmap) {
-               if (lod->lod_ost_count <= lag->lag_ost_avoid_bitmap->size) {
-                       CFS_RESET_BITMAP(lag->lag_ost_avoid_bitmap);
+               if (lod->lod_ost_count <= lag->lag_ost_avoid_size) {
+                       bitmap_zero(lag->lag_ost_avoid_bitmap,
+                                   lag->lag_ost_avoid_size);
                } else {
                } else {
-                       CFS_FREE_BITMAP(lag->lag_ost_avoid_bitmap);
+                       bitmap_free(lag->lag_ost_avoid_bitmap);
                        lag->lag_ost_avoid_bitmap = NULL;
                }
        }
 
        if (!lag->lag_ost_avoid_bitmap) {
                        lag->lag_ost_avoid_bitmap = NULL;
                }
        }
 
        if (!lag->lag_ost_avoid_bitmap) {
-               bitmap = CFS_ALLOCATE_BITMAP(lod->lod_ost_count);
+               bitmap = bitmap_zalloc(lod->lod_ost_count, GFP_KERNEL);
                if (!bitmap)
                        return -ENOMEM;
        }
                if (!bitmap)
                        return -ENOMEM;
        }
@@ -2359,7 +2360,7 @@ int lod_prepare_avoidance(const struct lu_env *env, struct lod_object *lo)
                 */
                OBD_ALLOC_PTR_ARRAY(new_oss, lod->lod_ost_count);
                if (!new_oss) {
                 */
                OBD_ALLOC_PTR_ARRAY(new_oss, lod->lod_ost_count);
                if (!new_oss) {
-                       CFS_FREE_BITMAP(bitmap);
+                       bitmap_free(bitmap);
                        return -ENOMEM;
                }
        }
                        return -ENOMEM;
                }
        }
@@ -2368,8 +2369,10 @@ int lod_prepare_avoidance(const struct lu_env *env, struct lod_object *lo)
                lag->lag_oss_avoid_array = new_oss;
                lag->lag_oaa_size = lod->lod_ost_count;
        }
                lag->lag_oss_avoid_array = new_oss;
                lag->lag_oaa_size = lod->lod_ost_count;
        }
-       if (bitmap)
+       if (bitmap) {
                lag->lag_ost_avoid_bitmap = bitmap;
                lag->lag_ost_avoid_bitmap = bitmap;
+               lag->lag_ost_avoid_size = lod->lod_ost_count;
+       }
 
        return 0;
 }
 
        return 0;
 }
@@ -2383,7 +2386,7 @@ void lod_collect_avoidance(struct lod_object *lo, struct lod_avoid_guide *lag,
 {
        struct lod_device *lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
        struct lod_layout_component *lod_comp = &lo->ldo_comp_entries[comp_idx];
 {
        struct lod_device *lod = lu2lod_dev(lo->ldo_obj.do_lu.lo_dev);
        struct lod_layout_component *lod_comp = &lo->ldo_comp_entries[comp_idx];
-       struct cfs_bitmap *bitmap = lag->lag_ost_avoid_bitmap;
+       unsigned long *bitmap = lag->lag_ost_avoid_bitmap;
        int i, j;
 
        /* iterate mirrors */
        int i, j;
 
        /* iterate mirrors */
@@ -2430,12 +2433,12 @@ void lod_collect_avoidance(struct lod_object *lo, struct lod_avoid_guide *lag,
                                ost = OST_TGT(lod, comp->llc_ost_indices[j]);
                                lsq = ost->ltd_qos.ltq_svr;
 
                                ost = OST_TGT(lod, comp->llc_ost_indices[j]);
                                lsq = ost->ltd_qos.ltq_svr;
 
-                               if (cfs_bitmap_check(bitmap, ost->ltd_index))
+                               if (test_bit(ost->ltd_index, bitmap))
                                        continue;
 
                                QOS_DEBUG("OST%d used in conflicting mirror "
                                          "component\n", ost->ltd_index);
                                        continue;
 
                                QOS_DEBUG("OST%d used in conflicting mirror "
                                          "component\n", ost->ltd_index);
-                               cfs_bitmap_set(bitmap, ost->ltd_index);
+                               set_bit(ost->ltd_index, bitmap);
                                lag->lag_ost_avail--;
 
                                for (k = 0; k < lag->lag_oaa_count; k++) {
                                lag->lag_ost_avail--;
 
                                for (k = 0; k < lag->lag_oaa_count; k++) {