diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c
index 8949663..da9dae8 100644
--- a/sys/kern/uipc_sem.c
+++ b/sys/kern/uipc_sem.c
@@ -86,7 +86,7 @@ __KERNEL_RCSID(0, "$NetBSD: uipc_sem.c,v 1.45 2016/04/24 19:48:29 dholland Exp $
 MODULE(MODULE_CLASS_MISC, ksem, NULL);
 
 #define	SEM_MAX_NAMELEN		14
-
+#define	SEM_NSEMS_MAX		256
 #define	KS_UNLINKED		0x01
 
 static kmutex_t		ksem_lock	__cacheline_aligned;
@@ -316,7 +316,7 @@ ksem_create(lwp_t *l, const char *name, ksem_t **ksret, mode_t mode, u_int val)
 	if (val > SEM_VALUE_MAX) {
 		return EINVAL;
 	}
-
+	
 	if (name != NULL) {
 		len = strlen(name);
 		if (len > SEM_MAX_NAMELEN) {
@@ -333,6 +333,14 @@ ksem_create(lwp_t *l, const char *name, ksem_t **ksret, mode_t mode, u_int val)
 		len = 0;
 	}
 
+        mutex_enter(&ksem_lock);
+        if (l->l_proc->p_nsems >= SEM_NSEMS_MAX) {
+                mutex_exit(&ksem_lock);
+                return -1;
+        }
+	l->l_proc->p_nsems += 1;
+        mutex_exit(&ksem_lock);
+
 	ks = kmem_zalloc(sizeof(ksem_t), KM_SLEEP);
 	mutex_init(&ks->ks_lock, MUTEX_DEFAULT, IPL_NONE);
 	cv_init(&ks->ks_cv, "psem");
@@ -347,6 +355,7 @@ ksem_create(lwp_t *l, const char *name, ksem_t **ksret, mode_t mode, u_int val)
 	ks->ks_gid = kauth_cred_getegid(uc);
 
 	atomic_inc_uint(&nsems_total);
+
 	*ksret = ks;
 	return 0;
 }
@@ -366,6 +375,10 @@ ksem_free(ksem_t *ks)
 	kmem_free(ks, sizeof(ksem_t));
 
 	atomic_dec_uint(&nsems_total);
+	
+	mutex_enter(&ksem_lock);
+	curproc->p_nsems -= 1;
+	mutex_exit(&ksem_lock);
 }
 
 int
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index 28aa2d7..e0fbb83 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -305,6 +305,7 @@ struct proc {
 	struct lcproc	*p_lwpctl;	/* p, a: _lwp_ctl() information */
 	pid_t		p_ppid;		/* :: cached parent pid */
 	pid_t 		p_fpid;		/* :: forked pid */
+	u_int		p_nsems;	/* Count of semaphores */
 
 /*
  * End area that is zeroed on creation
