@@ -75,8 +75,6 @@ struct rush {
7575static const struct hash_slinger * hash ;
7676static struct objhead * private_oh ;
7777
78- static void hsh_rush1 (const struct worker * , struct objcore * , struct rush * );
79- static void hsh_rush2 (struct worker * , struct rush * );
8078static int hsh_deref_objhead (struct worker * wrk , struct objhead * * poh );
8179static int hsh_deref_objhead_unlock (struct worker * wrk , struct objhead * * poh );
8280
@@ -347,6 +345,80 @@ hsh_insert_busyobj(const struct worker *wrk, struct objhead *oh)
347345 return (oc );
348346}
349347
348+ /*---------------------------------------------------------------------
349+ * Pick the req's we are going to rush from the waiting list
350+ */
351+
352+ static void
353+ hsh_rush1 (const struct worker * wrk , struct objcore * oc , struct rush * r )
354+ {
355+ int max , i ;
356+ unsigned xid = 0 ;
357+ struct req * req ;
358+
359+ AZ (oc -> flags & OC_F_BUSY );
360+ max = oc -> flags != 0 ? cache_param -> rush_exponent : INT_MAX ;
361+ assert (max > 0 );
362+
363+ CHECK_OBJ_NOTNULL (wrk , WORKER_MAGIC );
364+ CHECK_OBJ_NOTNULL (oc , OBJCORE_MAGIC );
365+ CHECK_OBJ_NOTNULL (r , RUSH_MAGIC );
366+ VTAILQ_INIT (& r -> reqs );
367+ Lck_AssertHeld (& oc -> objhead -> mtx );
368+ for (i = 0 ; i < max ; i ++ ) {
369+ req = VTAILQ_FIRST (& oc -> waitinglist );
370+ if (req == NULL )
371+ break ;
372+
373+ if (DO_DEBUG (DBG_WAITINGLIST )) {
374+ xid = VXID (req -> vsl -> wid );
375+ VSLb (wrk -> vsl , SLT_Debug ,
376+ "waiting list rush for req %u" , xid );
377+ }
378+
379+ assert (oc -> refcnt > 0 );
380+ oc -> refcnt ++ ;
381+ CHECK_OBJ_NOTNULL (req , REQ_MAGIC );
382+ wrk -> stats -> busy_wakeup ++ ;
383+ AZ (req -> wrk );
384+ VTAILQ_REMOVE (& oc -> waitinglist , req , w_list );
385+ VTAILQ_INSERT_TAIL (& r -> reqs , req , w_list );
386+ req -> waitinglist = 0 ;
387+ }
388+ }
389+
390+ /*---------------------------------------------------------------------
391+ * Rush req's that came from waiting list.
392+ */
393+
394+ static void
395+ hsh_rush2 (struct worker * wrk , struct rush * r )
396+ {
397+ struct req * req ;
398+
399+ CHECK_OBJ_NOTNULL (wrk , WORKER_MAGIC );
400+ CHECK_OBJ_NOTNULL (r , RUSH_MAGIC );
401+
402+ while (!VTAILQ_EMPTY (& r -> reqs )) {
403+ req = VTAILQ_FIRST (& r -> reqs );
404+ CHECK_OBJ_NOTNULL (req , REQ_MAGIC );
405+ VTAILQ_REMOVE (& r -> reqs , req , w_list );
406+ DSL (DBG_WAITINGLIST , req -> vsl -> wid , "off waiting list" );
407+ if (req -> transport -> reembark != NULL ) {
408+ // For ESI includes
409+ req -> transport -> reembark (wrk , req );
410+ } else {
411+ /*
412+ * We ignore the queue limits which apply to new
413+ * requests because if we fail to reschedule there
414+ * may be vmod_privs to cleanup and we need a proper
415+ * workerthread for that.
416+ */
417+ AZ (Pool_Task (req -> sp -> pool , req -> task , TASK_QUEUE_RUSH ));
418+ }
419+ }
420+ }
421+
350422/*---------------------------------------------------------------------
351423 */
352424
@@ -768,80 +840,6 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
768840 return (lr );
769841}
770842
771- /*---------------------------------------------------------------------
772- * Pick the req's we are going to rush from the waiting list
773- */
774-
775- static void
776- hsh_rush1 (const struct worker * wrk , struct objcore * oc , struct rush * r )
777- {
778- int max , i ;
779- unsigned xid = 0 ;
780- struct req * req ;
781-
782- AZ (oc -> flags & OC_F_BUSY );
783- max = oc -> flags != 0 ? cache_param -> rush_exponent : INT_MAX ;
784- assert (max > 0 );
785-
786- CHECK_OBJ_NOTNULL (wrk , WORKER_MAGIC );
787- CHECK_OBJ_NOTNULL (oc , OBJCORE_MAGIC );
788- CHECK_OBJ_NOTNULL (r , RUSH_MAGIC );
789- VTAILQ_INIT (& r -> reqs );
790- Lck_AssertHeld (& oc -> objhead -> mtx );
791- for (i = 0 ; i < max ; i ++ ) {
792- req = VTAILQ_FIRST (& oc -> waitinglist );
793- if (req == NULL )
794- break ;
795-
796- if (DO_DEBUG (DBG_WAITINGLIST )) {
797- xid = VXID (req -> vsl -> wid );
798- VSLb (wrk -> vsl , SLT_Debug ,
799- "waiting list rush for req %u" , xid );
800- }
801-
802- assert (oc -> refcnt > 0 );
803- oc -> refcnt ++ ;
804- CHECK_OBJ_NOTNULL (req , REQ_MAGIC );
805- wrk -> stats -> busy_wakeup ++ ;
806- AZ (req -> wrk );
807- VTAILQ_REMOVE (& oc -> waitinglist , req , w_list );
808- VTAILQ_INSERT_TAIL (& r -> reqs , req , w_list );
809- req -> waitinglist = 0 ;
810- }
811- }
812-
813- /*---------------------------------------------------------------------
814- * Rush req's that came from waiting list.
815- */
816-
817- static void
818- hsh_rush2 (struct worker * wrk , struct rush * r )
819- {
820- struct req * req ;
821-
822- CHECK_OBJ_NOTNULL (wrk , WORKER_MAGIC );
823- CHECK_OBJ_NOTNULL (r , RUSH_MAGIC );
824-
825- while (!VTAILQ_EMPTY (& r -> reqs )) {
826- req = VTAILQ_FIRST (& r -> reqs );
827- CHECK_OBJ_NOTNULL (req , REQ_MAGIC );
828- VTAILQ_REMOVE (& r -> reqs , req , w_list );
829- DSL (DBG_WAITINGLIST , req -> vsl -> wid , "off waiting list" );
830- if (req -> transport -> reembark != NULL ) {
831- // For ESI includes
832- req -> transport -> reembark (wrk , req );
833- } else {
834- /*
835- * We ignore the queue limits which apply to new
836- * requests because if we fail to reschedule there
837- * may be vmod_privs to cleanup and we need a proper
838- * workerthread for that.
839- */
840- AZ (Pool_Task (req -> sp -> pool , req -> task , TASK_QUEUE_RUSH ));
841- }
842- }
843- }
844-
845843/*---------------------------------------------------------------------
846844 * Purge an entire objhead
847845 */
0 commit comments