Skip to content

Commit dc397e0

Browse files
committed
cache_req: Allocate topreq only if needed
From a discussion here: varnishcache#4269 (comment)
1 parent 4fe462a commit dc397e0

8 files changed

Lines changed: 18 additions & 16 deletions

File tree

bin/varnishd/acceptor/cache_acceptor_tcp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ vca_tcp_make_session(struct worker *wrk, void *arg)
406406

407407
vca_tcp_sockopt_set(wa->acceptlsock, sp);
408408

409-
req = Req_New(sp);
409+
req = Req_New(sp, NULL);
410410
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
411411
req->htc->rfd = &sp->fd;
412412

bin/varnishd/acceptor/cache_acceptor_uds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ vca_uds_make_session(struct worker *wrk, void *arg)
356356

357357
vca_uds_sockopt_set(wa->acceptlsock, sp);
358358

359-
req = Req_New(sp);
359+
req = Req_New(sp, NULL);
360360
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
361361
req->htc->rfd = &sp->fd;
362362

bin/varnishd/cache/cache_esi_deliver.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ ved_include(struct req *preq, const char *src, const char *host,
132132
return;
133133
}
134134

135-
req = Req_New(sp);
135+
req = Req_New(sp, preq);
136136
AN(req);
137137
THR_SetRequest(req);
138138
assert(IS_NO_VXID(req->vsl->wid));
@@ -148,9 +148,6 @@ ved_include(struct req *preq, const char *src, const char *host,
148148

149149
VSLb_ts_req(req, "Start", W_TIM_real(wrk));
150150

151-
memset(req->top, 0, sizeof *req->top);
152-
req->top = preq->top;
153-
154151
HTTP_Setup(req->http, req->ws, req->vsl, SLT_ReqMethod);
155152
HTTP_Dup(req->http, preq->http0);
156153

@@ -182,7 +179,7 @@ ved_include(struct req *preq, const char *src, const char *host,
182179
req->req_body_status = BS_NONE;
183180

184181
AZ(req->vcl);
185-
AN(req->top);
182+
assert(req->top == preq->top);
186183
if (req->top->vcl0)
187184
req->vcl = req->top->vcl0;
188185
else

bin/varnishd/cache/cache_req.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ Req_LogStart(const struct worker *wrk, struct req *req)
123123
*/
124124

125125
struct req *
126-
Req_New(struct sess *sp)
126+
Req_New(struct sess *sp, struct req *preq)
127127
{
128128
struct pool *pp;
129129
struct req *req;
@@ -134,6 +134,7 @@ Req_New(struct sess *sp)
134134
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
135135
pp = sp->pool;
136136
CHECK_OBJ_NOTNULL(pp, POOL_MAGIC);
137+
CHECK_OBJ_ORNULL(preq, REQ_MAGIC);
137138

138139
req = MPL_Get(pp->mpl_req, &sz);
139140
AN(req);
@@ -181,10 +182,14 @@ Req_New(struct sess *sp)
181182
req->htc->doclose = SC_NULL;
182183
p = (void*)PRNDUP(p + sizeof(*req->htc));
183184

184-
req->top = (void*)p;
185-
INIT_OBJ(req->top, REQTOP_MAGIC);
186-
req->top->topreq = req;
187-
p = (void*)PRNDUP(p + sizeof(*req->top));
185+
if (UNLIKELY(preq != NULL))
186+
req->top = preq->top;
187+
else {
188+
req->top = (void*)p;
189+
INIT_OBJ(req->top, REQTOP_MAGIC);
190+
req->top->topreq = req;
191+
p = (void*)PRNDUP(p + sizeof(*req->top));
192+
}
188193

189194
assert(p < e);
190195

bin/varnishd/cache/cache_varnishd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ void pan_pool(struct vsb *);
411411
int VRG_CheckBo(struct busyobj *);
412412

413413
/* cache_req.c */
414-
struct req *Req_New(struct sess *);
414+
struct req *Req_New(struct sess *, struct req *);
415415
void Req_Release(struct req *);
416416
void Req_Rollback(VRT_CTX);
417417
void Req_Cleanup(struct sess *sp, struct worker *wrk, struct req *req);

bin/varnishd/http1/cache_http1_fsm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ http1_unwait(struct worker *wrk, void *arg)
141141
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
142142
CAST_OBJ_NOTNULL(sp, arg, SESS_MAGIC);
143143
WS_Release(sp->ws, 0);
144-
req = Req_New(sp);
144+
req = Req_New(sp, NULL);
145145
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
146146
req->htc->rfd = &sp->fd;
147147
HTC_RxInit(req->htc, req->ws);

bin/varnishd/http2/cache_http2_proto.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ h2_new_req(struct h2_sess *h2, unsigned stream, struct req *req)
150150

151151
ASSERT_RXTHR(h2);
152152
if (req == NULL)
153-
req = Req_New(h2->sess);
153+
req = Req_New(h2->sess, NULL);
154154
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
155155

156156
r2 = WS_Alloc(req->ws, sizeof *r2);

bin/varnishd/http2/cache_http2_session.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ h2_init_sess(struct sess *sp,
132132
assert(*up == 0);
133133

134134
if (srq == NULL)
135-
srq = Req_New(sp);
135+
srq = Req_New(sp, NULL);
136136
AN(srq);
137137
h2 = h2s;
138138
AN(h2);

0 commit comments

Comments
 (0)