Whamcloud - gitweb
LU-9859 libcfs: move tgt_descs to standard Linux bitmaps.
[fs/lustre-release.git] / lustre / obdclass / lu_tgt_descs.c
index c7d8bbe..22d79a1 100644 (file)
@@ -110,10 +110,6 @@ int lu_qos_add_tgt(struct lu_qos *qos, struct lu_tgt_desc *tgt)
 
        ENTRY;
 
-       /* tgt not connected, this function will be called again later */
-       if (!exp)
-               RETURN(0);
-
        down_write(&qos->lq_rw_sem);
        /*
         * a bit hacky approach to learn NID of corresponding connection
@@ -268,7 +264,7 @@ int lu_tgt_descs_init(struct lu_tgt_descs *ltd, bool is_mdt)
         * the tgt array and bitmap are allocated/grown dynamically as tgts are
         * added to the LOD/LMV, see lu_tgt_descs_add()
         */
-       ltd->ltd_tgt_bitmap = CFS_ALLOCATE_BITMAP(BITS_PER_LONG);
+       ltd->ltd_tgt_bitmap = bitmap_zalloc(BITS_PER_LONG, GFP_NOFS);
        if (!ltd->ltd_tgt_bitmap)
                return -ENOMEM;
 
@@ -286,6 +282,8 @@ int lu_tgt_descs_init(struct lu_tgt_descs *ltd, bool is_mdt)
        /* Default threshold for rr (roughly 17%) */
        ltd->ltd_qos.lq_threshold_rr = 43;
        ltd->ltd_is_mdt = is_mdt;
+       if (is_mdt)
+               ltd->ltd_lmv_desc.ld_pattern = LMV_HASH_TYPE_DEFAULT;
 
        lu_qos_rr_init(&ltd->ltd_qos.lq_rr);
 
@@ -302,7 +300,7 @@ void lu_tgt_descs_fini(struct lu_tgt_descs *ltd)
 {
        int i;
 
-       CFS_FREE_BITMAP(ltd->ltd_tgt_bitmap);
+       bitmap_free(ltd->ltd_tgt_bitmap);
        for (i = 0; i < TGT_PTRS; i++) {
                if (ltd->ltd_tgt_idx[i])
                        OBD_FREE_PTR(ltd->ltd_tgt_idx[i]);
@@ -326,27 +324,27 @@ EXPORT_SYMBOL(lu_tgt_descs_fini);
  */
 static int lu_tgt_descs_resize(struct lu_tgt_descs *ltd, __u32 newsize)
 {
-       struct cfs_bitmap *new_bitmap, *old_bitmap = NULL;
+       unsigned long *new_bitmap, *old_bitmap = NULL;
 
        /* someone else has already resize the array */
        if (newsize <= ltd->ltd_tgts_size)
                return 0;
 
-       new_bitmap = CFS_ALLOCATE_BITMAP(newsize);
+       new_bitmap = bitmap_zalloc(newsize, GFP_NOFS);
        if (!new_bitmap)
                return -ENOMEM;
 
        if (ltd->ltd_tgts_size > 0) {
                /* the bitmap already exists, copy data from old one */
-               cfs_bitmap_copy(new_bitmap, ltd->ltd_tgt_bitmap);
+               bitmap_copy(new_bitmap, ltd->ltd_tgt_bitmap,
+                           ltd->ltd_tgts_size);
                old_bitmap = ltd->ltd_tgt_bitmap;
        }
 
        ltd->ltd_tgts_size  = newsize;
        ltd->ltd_tgt_bitmap = new_bitmap;
 
-       if (old_bitmap)
-               CFS_FREE_BITMAP(old_bitmap);
+       bitmap_free(old_bitmap);
 
        CDEBUG(D_CONFIG, "tgt size: %d\n", ltd->ltd_tgts_size);
 
@@ -383,7 +381,7 @@ int ltd_add_tgt(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt)
                rc = lu_tgt_descs_resize(ltd, newsize);
                if (rc)
                        RETURN(rc);
-       } else if (cfs_bitmap_check(ltd->ltd_tgt_bitmap, index)) {
+       } else if (test_bit(index, ltd->ltd_tgt_bitmap)) {
                RETURN(-EEXIST);
        }
 
@@ -394,7 +392,7 @@ int ltd_add_tgt(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt)
        }
 
        LTD_TGT(ltd, tgt->ltd_index) = tgt;
-       cfs_bitmap_set(ltd->ltd_tgt_bitmap, tgt->ltd_index);
+       set_bit(tgt->ltd_index, ltd->ltd_tgt_bitmap);
 
        ltd->ltd_lov_desc.ld_tgt_count++;
        if (tgt->ltd_active)
@@ -411,7 +409,7 @@ void ltd_del_tgt(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt)
 {
        lu_qos_del_tgt(&ltd->ltd_qos, tgt);
        LTD_TGT(ltd, tgt->ltd_index) = NULL;
-       cfs_bitmap_clear(ltd->ltd_tgt_bitmap, tgt->ltd_index);
+       clear_bit(tgt->ltd_index, ltd->ltd_tgt_bitmap);
        ltd->ltd_lov_desc.ld_tgt_count--;
        if (tgt->ltd_active)
                ltd->ltd_lov_desc.ld_active_tgt_count--;
@@ -531,7 +529,7 @@ int ltd_qos_penalties_calc(struct lu_tgt_descs *ltd)
                 * per-tgt penalty is
                 * prio * bavail * iavail / (num_tgt - 1) / 2
                 */
-               tgt->ltd_qos.ltq_penalty_per_obj = prio_wide * ba * ia;
+               tgt->ltd_qos.ltq_penalty_per_obj = prio_wide * ba * ia >> 8;
                do_div(tgt->ltd_qos.ltq_penalty_per_obj, num_active);
                tgt->ltd_qos.ltq_penalty_per_obj >>= 1;
 
@@ -565,8 +563,9 @@ int ltd_qos_penalties_calc(struct lu_tgt_descs *ltd)
        list_for_each_entry(svr, &qos->lq_svr_list, lsq_svr_list) {
                ba = svr->lsq_bavail;
                ia = svr->lsq_iavail;
-               svr->lsq_penalty_per_obj = prio_wide * ba  * ia;
-               do_div(ba, svr->lsq_tgt_count * num_active);
+               svr->lsq_penalty_per_obj = prio_wide * ba  * ia >> 8;
+               do_div(svr->lsq_penalty_per_obj,
+                      svr->lsq_tgt_count * num_active);
                svr->lsq_penalty_per_obj >>= 1;
 
                age = (now - svr->lsq_used) >> 3;
@@ -661,6 +660,7 @@ int ltd_qos_update(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt,
                if (!tgt->ltd_active)
                        continue;
 
+               ltq = &tgt->ltd_qos;
                if (ltq->ltq_penalty < ltq->ltq_penalty_per_obj)
                        ltq->ltq_penalty = 0;
                else
@@ -672,9 +672,10 @@ int ltd_qos_update(struct lu_tgt_descs *ltd, struct lu_tgt_desc *tgt,
                if (ltq->ltq_usable)
                        *total_wt += ltq->ltq_weight;
 
-               CDEBUG(D_OTHER, "recalc tgt %d usable=%d avail=%llu tgtppo=%llu tgtp=%llu svrppo=%llu svrp=%llu wt=%llu\n",
+               CDEBUG(D_OTHER, "recalc tgt %d usable=%d bavail=%llu ffree=%llu tgtppo=%llu tgtp=%llu svrppo=%llu svrp=%llu wt=%llu\n",
                          tgt->ltd_index, ltq->ltq_usable,
-                         tgt_statfs_bavail(tgt) >> 10,
+                         tgt_statfs_bavail(tgt) >> 16,
+                         tgt_statfs_iavail(tgt) >> 8,
                          ltq->ltq_penalty_per_obj >> 10,
                          ltq->ltq_penalty >> 10,
                          ltq->ltq_svr->lsq_penalty_per_obj >> 10,