diff --git a/sys/kern/uipc_sem.c b/sys/kern/uipc_sem.c
index 8949663..24566ff 100644
--- a/sys/kern/uipc_sem.c
+++ b/sys/kern/uipc_sem.c
@@ -87,6 +87,7 @@ 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;
@@ -333,6 +334,11 @@ ksem_create(lwp_t *l, const char *name, ksem_t **ksret, mode_t mode, u_int val)
 		len = 0;
 	}
 
+	if (atomic_inc_uint_nv(&l->l_proc->p_nsems) > SEM_NSEMS_MAX) {
+               atomic_dec_uint(&l->l_proc->p_nsems);
+		return -1;
+       }
+
 	ks = kmem_zalloc(sizeof(ksem_t), KM_SLEEP);
 	mutex_init(&ks->ks_lock, MUTEX_DEFAULT, IPL_NONE);
 	cv_init(&ks->ks_cv, "psem");
@@ -366,6 +372,7 @@ ksem_free(ksem_t *ks)
 	kmem_free(ks, sizeof(ksem_t));
 
 	atomic_dec_uint(&nsems_total);
+ 	atomic_dec_uint(&curproc->p_nsems);	
 }
 
 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
