diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c
new file mode 100644
index 0819641..780e3a5
*** a/src/backend/storage/ipc/dsm_impl.c
--- b/src/backend/storage/ipc/dsm_impl.c
*************** dsm_impl_posix(dsm_op op, dsm_handle han
*** 289,296 ****
  		if (errno != EEXIST)
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not open shared memory segment \"%s\": %m",
! 							name)));
  		return false;
  	}
  
--- 289,299 ----
  		if (errno != EEXIST)
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not open POSIX shared memory segment \"%s\": %m",
! 							name),
! 					 errhint("This error usually means that /dev/shm is not mounted, or its "
! 							 "permissions do not allow the database user to create files "
! 							 "there.")));
  		return false;
  	}
  
*************** dsm_impl_posix(dsm_op op, dsm_handle han
*** 313,319 ****
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not stat shared memory segment \"%s\": %m",
  							name)));
  			return false;
  		}
--- 316,322 ----
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not stat POSIX shared memory segment \"%s\": %m",
  							name)));
  			return false;
  		}
*************** dsm_impl_posix(dsm_op op, dsm_handle han
*** 332,338 ****
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 		 errmsg("could not resize shared memory segment %s to %zu bytes: %m",
  				name, request_size)));
  		return false;
  	}
--- 335,341 ----
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 		 errmsg("could not resize POSIX shared memory segment %s to %zu bytes: %m",
  				name, request_size)));
  		return false;
  	}
*************** dsm_impl_posix(dsm_op op, dsm_handle han
*** 358,364 ****
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
--- 361,367 ----
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap POSIX shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
*************** dsm_impl_posix(dsm_op op, dsm_handle han
*** 382,388 ****
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not map shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
--- 385,391 ----
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not map POSIX shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
*************** dsm_impl_sysv(dsm_op op, dsm_handle hand
*** 512,518 ****
  				errno = save_errno;
  				ereport(elevel,
  						(errcode_for_dynamic_shared_memory(),
! 						 errmsg("could not get shared memory segment: %m")));
  			}
  			return false;
  		}
--- 515,521 ----
  				errno = save_errno;
  				ereport(elevel,
  						(errcode_for_dynamic_shared_memory(),
! 						 errmsg("could not get System V shared memory segment: %m")));
  			}
  			return false;
  		}
*************** dsm_impl_sysv(dsm_op op, dsm_handle hand
*** 530,536 ****
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
--- 533,539 ----
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap System V shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
*************** dsm_impl_sysv(dsm_op op, dsm_handle hand
*** 540,546 ****
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				  errmsg("could not remove shared memory segment \"%s\": %m",
  						 name)));
  			return false;
  		}
--- 543,549 ----
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				  errmsg("could not remove System V shared memory segment \"%s\": %m",
  						 name)));
  			return false;
  		}
*************** dsm_impl_sysv(dsm_op op, dsm_handle hand
*** 556,562 ****
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not stat shared memory segment \"%s\": %m",
  							name)));
  			return false;
  		}
--- 559,565 ----
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not stat System V shared memory segment \"%s\": %m",
  							name)));
  			return false;
  		}
*************** dsm_impl_sysv(dsm_op op, dsm_handle hand
*** 577,583 ****
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not map shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
--- 580,586 ----
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not map System V shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
*************** dsm_impl_windows(dsm_op op, dsm_handle h
*** 645,651 ****
  			_dosmaperr(GetLastError());
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
--- 648,654 ----
  			_dosmaperr(GetLastError());
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap Windows shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
*************** dsm_impl_windows(dsm_op op, dsm_handle h
*** 655,661 ****
  			_dosmaperr(GetLastError());
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				  errmsg("could not remove shared memory segment \"%s\": %m",
  						 name)));
  			return false;
  		}
--- 658,664 ----
  			_dosmaperr(GetLastError());
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				  errmsg("could not remove Windows shared memory segment \"%s\": %m",
  						 name)));
  			return false;
  		}
*************** dsm_impl_windows(dsm_op op, dsm_handle h
*** 691,697 ****
  			_dosmaperr(GetLastError());
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				  errmsg("could not create shared memory segment \"%s\": %m",
  						 name)));
  			return false;
  		}
--- 694,700 ----
  			_dosmaperr(GetLastError());
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				  errmsg("could not create Windows shared memory segment \"%s\": %m",
  						 name)));
  			return false;
  		}
*************** dsm_impl_windows(dsm_op op, dsm_handle h
*** 718,724 ****
  			_dosmaperr(GetLastError());
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not open shared memory segment \"%s\": %m",
  							name)));
  			return false;
  		}
--- 721,727 ----
  			_dosmaperr(GetLastError());
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not open Windows shared memory segment \"%s\": %m",
  							name)));
  			return false;
  		}
*************** dsm_impl_windows(dsm_op op, dsm_handle h
*** 739,745 ****
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not map shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
--- 742,748 ----
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not map Windows shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
*************** dsm_impl_windows(dsm_op op, dsm_handle h
*** 763,769 ****
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not stat shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
--- 766,772 ----
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not stat Windows shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
*************** dsm_impl_mmap(dsm_op op, dsm_handle hand
*** 808,814 ****
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
--- 811,817 ----
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap mmap shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
*************** dsm_impl_mmap(dsm_op op, dsm_handle hand
*** 818,824 ****
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				  errmsg("could not remove shared memory segment \"%s\": %m",
  						 name)));
  			return false;
  		}
--- 821,827 ----
  		{
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				  errmsg("could not remove mmap shared memory segment \"%s\": %m",
  						 name)));
  			return false;
  		}
*************** dsm_impl_mmap(dsm_op op, dsm_handle hand
*** 832,838 ****
  		if (errno != EEXIST)
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not open shared memory segment \"%s\": %m",
  							name)));
  		return false;
  	}
--- 835,841 ----
  		if (errno != EEXIST)
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not open mmap shared memory segment \"%s\": %m",
  							name)));
  		return false;
  	}
*************** dsm_impl_mmap(dsm_op op, dsm_handle hand
*** 856,862 ****
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not stat shared memory segment \"%s\": %m",
  							name)));
  			return false;
  		}
--- 859,865 ----
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not stat mmap shared memory segment \"%s\": %m",
  							name)));
  			return false;
  		}
*************** dsm_impl_mmap(dsm_op op, dsm_handle hand
*** 875,881 ****
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 		 errmsg("could not resize shared memory segment %s to %zu bytes: %m",
  				name, request_size)));
  		return false;
  	}
--- 878,884 ----
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 		 errmsg("could not resize mmap shared memory segment %s to %zu bytes: %m",
  				name, request_size)));
  		return false;
  	}
*************** dsm_impl_mmap(dsm_op op, dsm_handle hand
*** 923,929 ****
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not resize shared memory segment %s to %zu bytes: %m",
  							name, request_size)));
  			return false;
  		}
--- 926,932 ----
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 					 errmsg("could not resize mmap shared memory segment %s to %zu bytes: %m",
  							name, request_size)));
  			return false;
  		}
*************** dsm_impl_mmap(dsm_op op, dsm_handle hand
*** 950,956 ****
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
--- 953,959 ----
  
  			ereport(elevel,
  					(errcode_for_dynamic_shared_memory(),
! 				   errmsg("could not unmap mmap shared memory segment \"%s\": %m",
  						  name)));
  			return false;
  		}
*************** dsm_impl_mmap(dsm_op op, dsm_handle hand
*** 974,980 ****
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not map shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
--- 977,983 ----
  
  		ereport(elevel,
  				(errcode_for_dynamic_shared_memory(),
! 				 errmsg("could not map mmap shared memory segment \"%s\": %m",
  						name)));
  		return false;
  	}
