X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosp%2Fosp_trans.c;h=9686863b7abfa1ab1c9a60ad4d09c969143dcae0;hb=f32fbf189fab57202810a9a47343a14c6c3ead95;hp=c7eb6815c7744d6a4619e7f6a1ebc6d4172a813d;hpb=ccabce23bd9e366c345c852f565766a799f61238;p=fs%2Flustre-release.git diff --git a/lustre/osp/osp_trans.c b/lustre/osp/osp_trans.c index c7eb681..9686863 100644 --- a/lustre/osp/osp_trans.c +++ b/lustre/osp/osp_trans.c @@ -347,6 +347,7 @@ int osp_prep_update_req(const struct lu_env *env, struct obd_import *imp, struct out_update_header *ouh; struct out_update_buffer *oub; __u32 buf_count = 0; + int page_count = 0; int repsize = 0; struct object_update_reply *reply; int rc, i; @@ -376,8 +377,8 @@ int osp_prep_update_req(const struct lu_env *env, struct obd_import *imp, buf_count++; } repsize += sizeof(*reply); - repsize = (repsize + OUT_UPDATE_REPLY_SIZE - 1) & - ~(OUT_UPDATE_REPLY_SIZE - 1); + if (repsize < OUT_UPDATE_REPLY_SIZE) + repsize = OUT_UPDATE_REPLY_SIZE; LASSERT(buf_count > 0); req = ptlrpc_request_alloc(imp, &RQF_OUT_UPDATE); @@ -418,13 +419,14 @@ int osp_prep_update_req(const struct lu_env *env, struct obd_import *imp, list_for_each_entry(ours, &our->our_req_list, ours_list) { oub->oub_size = ours->ours_req_size; oub++; + page_count += round_up(ours->ours_req_size, PAGE_SIZE) + 1; } req->rq_bulk_write = 1; - desc = ptlrpc_prep_bulk_imp(req, buf_count, + desc = ptlrpc_prep_bulk_imp(req, page_count, MD_MAX_BRW_SIZE >> LNET_MTU_BITS, - PTLRPC_BULK_GET_SOURCE | PTLRPC_BULK_BUF_KVEC, - MDS_BULK_PORTAL, &ptlrpc_bulk_kvec_ops); + PTLRPC_BULK_GET_SOURCE | PTLRPC_BULK_BUF_KIOV, + MDS_BULK_PORTAL, &ptlrpc_bulk_kiov_nopin_ops); if (desc == NULL) GOTO(out_req, rc = -ENOMEM); @@ -602,17 +604,17 @@ static void osp_update_callback_fini(const struct lu_env *env, * \retval negative error number on failure */ static int osp_update_interpret(const struct lu_env *env, - struct ptlrpc_request *req, void *arg, int rc) + struct ptlrpc_request *req, void *args, int rc) { - struct object_update_reply *reply = NULL; - struct osp_update_args *oaua = arg; - struct osp_update_request *our = oaua->oaua_update; - struct osp_thandle *oth; - struct osp_update_callback *ouc; - struct osp_update_callback *next; - int count = 0; - int index = 0; - int rc1 = 0; + struct object_update_reply *reply = NULL; + struct osp_update_args *oaua = args; + struct osp_update_request *our = oaua->oaua_update; + struct osp_thandle *oth; + struct osp_update_callback *ouc; + struct osp_update_callback *next; + int count = 0; + int index = 0; + int rc1 = 0; ENTRY; @@ -735,7 +737,7 @@ int osp_unplug_async_request(const struct lu_env *env, } osp_update_request_destroy(env, our); } else { - args = ptlrpc_req_async_args(req); + args = ptlrpc_req_async_args(args, req); args->oaua_update = our; args->oaua_count = NULL; args->oaua_waitq = NULL; @@ -1118,7 +1120,7 @@ static int osp_send_update_req(const struct lu_env *env, RETURN(rc); } - args = ptlrpc_req_async_args(req); + args = ptlrpc_req_async_args(args, req); args->oaua_update = our; /* set env to NULL, in case the interrupt cb and current function * are in different thread */ @@ -1376,8 +1378,6 @@ void osp_invalidate_request(struct osp_device *osp) return; } - INIT_LIST_HEAD(&list); - spin_lock(&ou->ou_lock); /* invalidate all of request in the sending list */ list_for_each_entry_safe(our, tmp, &ou->ou_list, our_list) { @@ -1432,7 +1432,6 @@ int osp_send_update_thread(void *arg) { struct lu_env env; struct osp_device *osp = arg; - struct l_wait_info lwi = { 0 }; struct osp_updates *ou = osp->opd_update; struct ptlrpc_thread *thread = &osp->opd_update_thread; struct osp_update_request *our = NULL; @@ -1451,9 +1450,9 @@ int osp_send_update_thread(void *arg) wake_up(&thread->t_ctl_waitq); while (1) { our = NULL; - l_wait_event(ou->ou_waitq, - !osp_send_update_thread_running(osp) || - osp_get_next_request(ou, &our), &lwi); + wait_event_idle(ou->ou_waitq, + !osp_send_update_thread_running(osp) || + osp_get_next_request(ou, &our)); if (!osp_send_update_thread_running(osp)) { if (our != NULL) {