X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_qos.c;h=527620a976738ea90d78147a83def8d3b4b3d2e0;hb=9f3469f1d00099b9301ba2b90c846c924ce7796b;hp=7d8ae114008aeb999cb0fdaff176daff79a8fdaa;hpb=cec72a356891eaa729314a7bc89c4b2aaef0a31b;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_qos.c b/lustre/lov/lov_qos.c index 7d8ae11..527620a 100644 --- a/lustre/lov/lov_qos.c +++ b/lustre/lov/lov_qos.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -28,15 +26,14 @@ /* * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, 2012, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ * Lustre is a trademark of Sun Microsystems, Inc. */ -#ifndef EXPORT_SYMTAB -# define EXPORT_SYMTAB -#endif #define DEBUG_SUBSYSTEM S_LOV #ifdef __KERNEL__ @@ -73,7 +70,7 @@ int qos_add_tgt(struct obd_device *obd, __u32 index) } cfs_down_write(&lov->lov_qos.lq_rw_sem); - cfs_mutex_down(&lov->lov_lock); + cfs_mutex_lock(&lov->lov_lock); cfs_list_for_each_entry(oss, &lov->lov_qos.lq_oss_list, lqo_oss_list) { if (obd_uuid_equals(&oss->lqo_uuid, &exp->exp_connection->c_remote_uuid)) { @@ -117,7 +114,7 @@ int qos_add_tgt(struct obd_device *obd, __u32 index) oss->lqo_ost_count); out: - cfs_mutex_up(&lov->lov_lock); + cfs_mutex_unlock(&lov->lov_lock); cfs_up_write(&lov->lov_qos.lq_rw_sem); RETURN(rc); } @@ -199,11 +196,11 @@ static int qos_calc_ppo(struct obd_device *obd) lov->lov_qos.lq_active_oss_count++; lov->lov_tgts[i]->ltd_qos.ltq_oss->lqo_bavail += temp; - /* per-OST penalty is prio * TGT_bavail / (num_ost - 1) / 2 */ - temp >>= 1; - do_div(temp, num_active); - lov->lov_tgts[i]->ltd_qos.ltq_penalty_per_obj = - (temp * prio_wide) >> 8; + /* per-OST penalty is prio * TGT_bavail / (num_ost - 1) / 2 */ + temp >>= 1; + lov_do_div64(temp, num_active); + lov->lov_tgts[i]->ltd_qos.ltq_penalty_per_obj = + (temp * prio_wide) >> 8; age = (now - lov->lov_tgts[i]->ltd_qos.ltq_used) >> 3; if (lov->lov_qos.lq_reset || age > 32 * lov->desc.ld_qos_maxage) @@ -232,9 +229,9 @@ static int qos_calc_ppo(struct obd_device *obd) /* Per-OSS penalty is prio * oss_avail / oss_osts / (num_oss - 1) / 2 */ cfs_list_for_each_entry(oss, &lov->lov_qos.lq_oss_list, lqo_oss_list) { - temp = oss->lqo_bavail >> 1; - do_div(temp, oss->lqo_ost_count * num_active); - oss->lqo_penalty_per_obj = (temp * prio_wide) >> 8; + temp = oss->lqo_bavail >> 1; + lov_do_div64(temp, oss->lqo_ost_count * num_active); + oss->lqo_penalty_per_obj = (temp * prio_wide) >> 8; age = (now - oss->lqo_used) >> 3; if (lov->lov_qos.lq_reset || age > 32 * lov->desc.ld_qos_maxage) @@ -505,7 +502,7 @@ static int lov_check_and_create_object(struct lov_obd *lov, int ost_idx, struct lov_request *req, struct obd_trans_info *oti) { - int stripe; + __u16 stripe; int rc = -EIO; ENTRY; @@ -523,7 +520,7 @@ static int lov_check_and_create_object(struct lov_obd *lov, int ost_idx, if (stripe >= lsm->lsm_stripe_count) { req->rq_idx = ost_idx; - rc = obd_create(lov->lov_tgts[ost_idx]->ltd_exp, + rc = obd_create(NULL, lov->lov_tgts[ost_idx]->ltd_exp, req->rq_oi.oi_oa, &req->rq_oi.oi_md, oti); } @@ -577,8 +574,8 @@ static int min_stripe_count(int stripe_cnt, int flags) stripe_cnt - (stripe_cnt / 4) : stripe_cnt); } -#define LOV_CREATE_RESEED_MULT 4 -#define LOV_CREATE_RESEED_MIN 1000 +#define LOV_CREATE_RESEED_MULT 30 +#define LOV_CREATE_RESEED_MIN 2000 /* Allocate objects on osts with round-robin algorithm */ static int alloc_rr(struct lov_obd *lov, int *idx_arr, int *stripe_cnt, char *poolname, int flags) @@ -790,7 +787,6 @@ static int alloc_qos(struct obd_export *exp, int *idx_arr, int *stripe_cnt, int stripe_cnt_min = min_stripe_count(*stripe_cnt, flags); struct pool_desc *pool; struct ost_pool *osts; - struct lov_qos_rr *lqr; ENTRY; if (stripe_cnt_min < 1) @@ -799,11 +795,9 @@ static int alloc_qos(struct obd_export *exp, int *idx_arr, int *stripe_cnt, pool = lov_find_pool(lov, poolname); if (pool == NULL) { osts = &(lov->lov_packed); - lqr = &(lov->lov_qos.lq_rr); } else { cfs_down_read(&pool_tgt_rw_sem(pool)); osts = &(pool->pool_obds); - lqr = &(pool->pool_rr); } obd_getref(exp->exp_obd); @@ -1008,7 +1002,7 @@ int qos_prep_create(struct obd_export *exp, struct lov_request_set *set) LASSERT(src_oa->o_valid & OBD_MD_FLGROUP); if (set->set_oi->oi_md == NULL) { - int stripes_def = lov_get_stripecnt(lov, 0); + __u16 stripes_def = lov_get_stripecnt(lov, LOV_MAGIC, 0); /* If the MDS file was truncated up to some size, stripe over * enough OSTs to allow the file to be created at that size. @@ -1032,8 +1026,8 @@ int qos_prep_create(struct obd_export *exp, struct lov_request_set *set) if (stripes < stripes_def) stripes = stripes_def; } else { - flag = LOV_USES_DEFAULT_STRIPE; - stripes = stripes_def; + flag = LOV_USES_DEFAULT_STRIPE; + stripes = stripes_def; } rc = lov_alloc_memmd(&set->set_oi->oi_md, stripes, @@ -1049,6 +1043,7 @@ int qos_prep_create(struct obd_export *exp, struct lov_request_set *set) lsm = set->set_oi->oi_md; lsm->lsm_object_id = src_oa->o_id; lsm->lsm_object_seq = src_oa->o_seq; + lsm->lsm_layout_gen = 0; /* actual generation set in mdd_lov_create() */ if (!lsm->lsm_stripe_size) lsm->lsm_stripe_size = lov->desc.ld_default_stripe_size; @@ -1132,11 +1127,12 @@ void qos_update(struct lov_obd *lov) void qos_statfs_done(struct lov_obd *lov) { - LASSERT(lov->lov_qos.lq_statfs_in_progress); cfs_down_write(&lov->lov_qos.lq_rw_sem); - lov->lov_qos.lq_statfs_in_progress = 0; - /* wake up any threads waiting for the statfs rpcs to complete */ - cfs_waitq_signal(&lov->lov_qos.lq_statfs_waitq); + if (lov->lov_qos.lq_statfs_in_progress) { + lov->lov_qos.lq_statfs_in_progress = 0; + /* wake up any threads waiting for the statfs rpcs to complete*/ + cfs_waitq_signal(&lov->lov_qos.lq_statfs_waitq); + } cfs_up_write(&lov->lov_qos.lq_rw_sem); } @@ -1202,7 +1198,7 @@ void qos_statfs_update(struct obd_device *obd, __u64 max_age, int wait) if (!set) GOTO(out_failed, rc = -ENOMEM); - rc = obd_statfs_async(obd, oinfo, max_age, set); + rc = obd_statfs_async(obd->obd_self_export, oinfo, max_age, set); if (rc || cfs_list_empty(&set->set_requests)) { if (rc) CWARN("statfs failed with %d\n", rc);