diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c
index 9d86bbe872..c67134ec27 100644
--- a/src/backend/storage/ipc/dsm.c
+++ b/src/backend/storage/ipc/dsm.c
@@ -461,12 +461,19 @@ dsm_shmem_init(void)
 	dsm_main_space_begin = ShmemInitStruct("Preallocated DSM", size, &found);
 	if (!found)
 	{
-		FreePageManager *fpm = (FreePageManager *) dsm_main_space_begin;
+		/*
+		 * fpm cannot be the same with dsm_main_space_begin due to the
+		 * restriction imposed by FreePageManagerInitialize() due to
+		 * relptr. Add MAXALIGN(1) to fpm to live with that restriction.
+		 */
+		int			gap = MAXALIGN(1);
+		FreePageManager *fpm =
+			(FreePageManager *) ((char *)dsm_main_space_begin + gap);
 		size_t		first_page = 0;
 		size_t		pages;
 
 		/* Reserve space for the FreePageManager. */
-		while (first_page * FPM_PAGE_SIZE < sizeof(FreePageManager))
+		while (first_page * FPM_PAGE_SIZE < sizeof(FreePageManager) + gap)
 			++first_page;
 
 		/* Initialize it and give it all the rest of the space. */
diff --git a/src/test/modules/test_misc/t/004_check_min_dsm_size.pl b/src/test/modules/test_misc/t/004_check_min_dsm_size.pl
new file mode 100644
index 0000000000..025dca33e4
--- /dev/null
+++ b/src/test/modules/test_misc/t/004_check_min_dsm_size.pl
@@ -0,0 +1,14 @@
+# Tests of min_dynamic_shared_memory
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+$node->init;
+$node->append_conf('postgresql.conf', 'min_dynamic_shared_memory = 1MB');
+$node->start;
+pass('check if server can start with min_dynamic_shared_memory');
+done_testing();
