diff --git a/src/backend/tcop/bgsession.c b/src/backend/tcop/bgsession.c
index 486819b..665ef30 100644
--- a/src/backend/tcop/bgsession.c
+++ b/src/backend/tcop/bgsession.c
@@ -135,8 +135,9 @@ BackgroundSessionStart(void)
 	BgwHandleStatus bgwstatus;
 	StringInfoData msg;
 	char		msgtype;
+	MemoryContext   oldcontext;
 
-	session = palloc(sizeof(*session));
+	session = MemoryContextAlloc(TopMemoryContext, sizeof(*session));
 
 	session->resowner = ResourceOwnerCreate(NULL, "background session");
 
@@ -188,8 +189,10 @@ BackgroundSessionStart(void)
 	shm_toc_insert(toc, BGSESSION_KEY_RESPONSE_QUEUE, response_mq);
 	shm_mq_set_receiver(response_mq, MyProc);
 
+	oldcontext = MemoryContextSwitchTo(TopMemoryContext);
 	session->command_qh = shm_mq_attach(command_mq, seg, NULL);
 	session->response_qh = shm_mq_attach(response_mq, seg, NULL);
+	MemoryContextSwitchTo(oldcontext);
 
 	worker.bgw_flags =
 		BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION;
@@ -200,11 +203,13 @@ BackgroundSessionStart(void)
 	worker.bgw_main_arg = UInt32GetDatum(dsm_segment_handle(seg));
 	worker.bgw_notify_pid = MyProcPid;
 
+	oldcontext = MemoryContextSwitchTo(TopMemoryContext);
 	if (!RegisterDynamicBackgroundWorker(&worker, &session->worker_handle))
 		ereport(ERROR,
 				(errcode(ERRCODE_INSUFFICIENT_RESOURCES),
 				 errmsg("could not register background process"),
 				 errhint("You might need to increase max_worker_processes.")));
+	MemoryContextSwitchTo(oldcontext);
 
 	shm_mq_set_handle(session->command_qh, session->worker_handle);
 	shm_mq_set_handle(session->response_qh, session->worker_handle);
