Whamcloud - gitweb
LU-9372 ptlrpc: drain "ptlrpc_request_buffer_desc" objects 52/26752/5
authorBruno Faccini <bruno.faccini@intel.com>
Thu, 20 Apr 2017 10:10:28 +0000 (12:10 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Fri, 12 May 2017 05:06:23 +0000 (05:06 +0000)
Prior to this patch, new "ptlrpc_request_buffer_desc"
could be additionally allocated upon need by
ptlrpc_check_rqbd_pool(), but will never be freed
until OST umount/stop by ptlrpc_service_purge_all().
Now try to release some of them when possible.

Signed-off-by: Bruno Faccini <bruno.faccini@intel.com>
Change-Id: Ieb72bab202e3f3d957cd2e6ce06bb56c4e21b1bd
Reviewed-on: https://review.whamcloud.com/26752
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Niu Yawei <yawei.niu@intel.com>
Reviewed-by: Henri Doreau <henri.doreau@cea.fr>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/ptlrpc/service.c

index 7006a57..f7e08f4 100644 (file)
@@ -939,10 +939,22 @@ void ptlrpc_server_drop_request(struct ptlrpc_request *req)
                        spin_lock(&svcpt->scp_lock);
                        /*
                         * now all reqs including the embedded req has been
-                        * disposed, schedule request buffer for re-use.
+                        * disposed, schedule request buffer for re-use
+                        * or free it to drain some in excess.
                         */
                        LASSERT(atomic_read(&rqbd->rqbd_req.rq_refcount) == 0);
-                       list_add_tail(&rqbd->rqbd_list, &svcpt->scp_rqbd_idle);
+                       if (svcpt->scp_nrqbds_posted >=
+                           svc->srv_nbuf_per_group &&
+                           !test_req_buffer_pressure) {
+                               /* like in ptlrpc_free_rqbd() */
+                               svcpt->scp_nrqbds_total--;
+                               OBD_FREE_LARGE(rqbd->rqbd_buffer,
+                                              svc->srv_buf_size);
+                               OBD_FREE_PTR(rqbd);
+                       } else {
+                               list_add_tail(&rqbd->rqbd_list,
+                                             &svcpt->scp_rqbd_idle);
+                       }
                }
 
                spin_unlock(&svcpt->scp_lock);