Skip to content
This repository was archived by the owner on Feb 16, 2026. It is now read-only.

Commit 6fe0207

Browse files
committed
hash: Group rush functions together
1 parent 05d9052 commit 6fe0207

1 file changed

Lines changed: 74 additions & 76 deletions

File tree

bin/varnishd/cache/cache_hash.c

Lines changed: 74 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ struct rush {
7575
static const struct hash_slinger *hash;
7676
static 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 *);
8078
static int hsh_deref_objhead(struct worker *wrk, struct objhead **poh);
8179
static 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

Comments
 (0)