Whamcloud - gitweb
LU-13004 osp: use KIOV in osp_prep_update_req
[fs/lustre-release.git] / lustre / osp / osp_trans.c
index f4eb8ad..9686863 100644 (file)
@@ -20,7 +20,7 @@
  * GPL HEADER END
  */
 /*
- * Copyright (c) 2014, 2016, Intel Corporation.
+ * Copyright (c) 2014, 2017, Intel Corporation.
  */
 /*
  * 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) {