[master] e920df6 Get struct sess back down to 128 bytes.

Poul-Henning Kamp phk at FreeBSD.org
Wed Feb 10 10:44:26 CET 2016


commit e920df6115ff9745635c26b88cbaf7884677fb5e
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Feb 10 09:43:54 2016 +0000

    Get struct sess back down to 128 bytes.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 27c32d3..36ecde1 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -635,7 +635,6 @@ struct sess {
 #define SESS_MAGIC		0x2c2f9c5a
 
 	enum sess_step		sess_step;
-	const struct transport	*transport;
 	struct lock		mtx;
 	int			fd;
 	uint32_t		vxid;
@@ -944,10 +943,10 @@ void CNT_AcctLogCharge(struct dstat *, struct req *);
 
 /* cache_session.c [SES] */
 struct sess *SES_New(struct pool *);
-void SES_Close(struct sess *sp, enum sess_close reason);
-void SES_Wait(struct sess *sp);
-void SES_Delete(struct sess *sp, enum sess_close reason, double now);
-void SES_NewPool(struct pool *pp, unsigned pool_no);
+void SES_Close(struct sess *, enum sess_close reason);
+void SES_Wait(struct sess *, const struct transport *);
+void SES_Delete(struct sess *, enum sess_close reason, double now);
+void SES_NewPool(struct pool *, unsigned pool_no);
 int SES_Reschedule_Req(struct req *);
 
 enum htc_status_e {
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index f6d6f82..6a701ea 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -377,9 +377,8 @@ vca_make_session(struct worker *wrk, void *arg)
 	req->htc->fd = sp->fd;
 	SES_RxInit(req->htc, req->ws,
 	    cache_param->http_req_size, cache_param->http_req_hdr_len);
-	
-	sp->transport = wa->acceptlsock->transport;
-	wrk->task.func = sp->transport->new_session;
+
+	wrk->task.func = wa->acceptlsock->transport->new_session;
 	wrk->task.priv = req;
 }
 
diff --git a/bin/varnishd/cache/cache_backend_tcp.c b/bin/varnishd/cache/cache_backend_tcp.c
index 13a026c..8ad54e3 100644
--- a/bin/varnishd/cache/cache_backend_tcp.c
+++ b/bin/varnishd/cache/cache_backend_tcp.c
@@ -83,7 +83,7 @@ tcp_handle(struct waited *w, enum wait_event ev, double now)
 	struct vbc *vbc;
 	struct tcp_pool *tp;
 
-	CAST_OBJ_NOTNULL(vbc, w->ptr, VBC_MAGIC);
+	CAST_OBJ_NOTNULL(vbc, w->priv1, VBC_MAGIC);
 	(void)ev;
 	(void)now;
 	CHECK_OBJ_NOTNULL(vbc->tcp_pool, TCP_POOL_MAGIC);
@@ -264,7 +264,7 @@ VBT_Recycle(const struct worker *wrk, struct tcp_pool *tp, struct vbc **vbcp)
 	Lck_Lock(&tp->mtx);
 	tp->n_used--;
 
-	vbc->waited->ptr = vbc;
+	vbc->waited->priv1 = vbc;
 	vbc->waited->fd = vbc->fd;
 	vbc->waited->idle = VTIM_real();
 	vbc->state = VBC_STATE_AVAIL;
diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index 97a697e..0a2cedf 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -380,7 +380,8 @@ pan_req(struct vsb *vsb, const struct req *req)
 		return;
 	VSB_indent(vsb, 2);
 
-	VSB_printf(vsb, "vxid = %u, ", VXID(req->vsl->wid));
+	VSB_printf(vsb, "vxid = %u, transport = %s", VXID(req->vsl->wid),
+	    req->transport == NULL ? "NULL" : req->transport->name);
 
 	switch (req->req_step) {
 #define REQ_STEP(l, u, arg) case R_STP_##u: stp = "R_STP_" #u; break;
@@ -449,8 +450,8 @@ pan_sess(struct vsb *vsb, const struct sess *sp)
 	if (pan_already(vsb, sp))
 		return;
 	VSB_indent(vsb, 2);
-	VSB_printf(vsb, "fd = %d, vxid = %u, xport = %s\n",
-	    sp->fd, VXID(sp->vxid), sp->transport->name);
+	VSB_printf(vsb, "fd = %d, vxid = %u\n",
+	    sp->fd, VXID(sp->vxid));
 	AZ(SES_Get_client_ip(sp, &ci));
 	AZ(SES_Get_client_port(sp, &cp));
 	VSB_printf(vsb, "client = %s %s,\n", ci, cp);
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 770ce73..9775332 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -335,9 +335,12 @@ ses_handle(struct waited *wp, enum wait_event ev, double now)
 	struct sess *sp;
 	struct pool *pp;
 	struct pool_task *tp;
+	const struct transport *xp;
 
 	CHECK_OBJ_NOTNULL(wp, WAITED_MAGIC);
-	CAST_OBJ_NOTNULL(sp, wp->ptr, SESS_MAGIC);
+	CAST_OBJ_NOTNULL(sp, wp->priv1, SESS_MAGIC);
+	CAST_OBJ_NOTNULL(xp, (const void*)wp->priv2, TRANSPORT_MAGIC);
+	AN(wp->priv2);
 	assert((void *)sp->ws->f == wp);
 	wp->magic = 0;
 	wp = NULL;
@@ -356,7 +359,7 @@ ses_handle(struct waited *wp, enum wait_event ev, double now)
 		CHECK_OBJ_NOTNULL(pp, POOL_MAGIC);
 		assert(sizeof *tp <= WS_Reserve(sp->ws, sizeof *tp));
 		tp = (void*)sp->ws->f;
-		tp->func = sp->transport->unwait;
+		tp->func = xp->unwait;
 		tp->priv = sp;
 		if (Pool_Task(pp, tp, TASK_QUEUE_REQ))
 			SES_Delete(sp, SC_OVERLOAD, now);
@@ -373,12 +376,13 @@ ses_handle(struct waited *wp, enum wait_event ev, double now)
  */
 
 void
-SES_Wait(struct sess *sp)
+SES_Wait(struct sess *sp, const struct transport *xp)
 {
 	struct pool *pp;
 	struct waited *wp;
 
 	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	CHECK_OBJ_NOTNULL(xp, TRANSPORT_MAGIC);
 	pp = sp->pool;
 	CHECK_OBJ_NOTNULL(pp, POOL_MAGIC);
 	/*
@@ -400,7 +404,8 @@ SES_Wait(struct sess *sp)
 	wp = (void*)sp->ws->f;
 	INIT_OBJ(wp, WAITED_MAGIC);
 	wp->fd = sp->fd;
-	wp->ptr = sp;
+	wp->priv1 = sp;
+	wp->priv2 = (uintptr_t)xp;
 	wp->idle = sp->t_idle;
 	wp->waitfor = &pp->wf;
 	if (Wait_Enter(pp->waiter, wp))
diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index 67274c1..dff2f0a 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -38,6 +38,7 @@
 #include <stdlib.h>
 
 #include "cache/cache.h"
+#include "common/heritage.h"
 #include "cache/cache_transport.h"
 #include "cache_http1.h"
 #include "hash/hash_slinger.h"
@@ -57,7 +58,7 @@ http1_req(struct worker *wrk, void *arg)
 	CAST_OBJ_NOTNULL(req, arg, REQ_MAGIC);
 
 	THR_SetRequest(req);
-	req->transport = req->sp->transport;
+	req->transport = &HTTP1_transport;
 	AZ(wrk->aws->r);
 	HTTP1_Session(wrk, req);
 	AZ(wrk->v1l);
@@ -289,7 +290,7 @@ HTTP1_Session(struct worker *wrk, struct req *req)
 			if (hs == HTC_S_IDLE) {
 				wrk->stats->sess_herd++;
 				Req_Release(req);
-				SES_Wait(sp);
+				SES_Wait(sp, &HTTP1_transport);
 				return;
 			}
 			if (hs != HTC_S_COMPLETE)
diff --git a/bin/varnishd/proxy/cache_proxy_proto.c b/bin/varnishd/proxy/cache_proxy_proto.c
index 061d1be..8290c7d 100644
--- a/bin/varnishd/proxy/cache_proxy_proto.c
+++ b/bin/varnishd/proxy/cache_proxy_proto.c
@@ -379,8 +379,7 @@ vpx_new_session(struct worker *wrk, void *arg)
 	else
 		req->htc->pipeline_e = req->htc->rxbuf_e;
 	SES_RxReInit(req->htc);
-	sp->transport = &HTTP1_transport;
-	wrk->task.func = sp->transport->new_session;
+	wrk->task.func = HTTP1_transport.new_session;
 	wrk->task.priv = req;
 }
 
diff --git a/bin/varnishd/waiter/waiter.h b/bin/varnishd/waiter/waiter.h
index 488c8e3..4cbabb6 100644
--- a/bin/varnishd/waiter/waiter.h
+++ b/bin/varnishd/waiter/waiter.h
@@ -66,7 +66,8 @@ struct waited {
 #define WAITED_MAGIC		0x1743992d
 	int			fd;
 	unsigned		idx;
-	void			*ptr;
+	void			*priv1;
+	uintptr_t		priv2;
 	const struct waitfor	*waitfor;
 	double			idle;
 };



More information about the varnish-commit mailing list