Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Apr 2010 15:33:31 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r206606 - stable/7/sys/kern
Message-ID:  <201004141533.o3EFXVHv012457@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Wed Apr 14 15:33:30 2010
New Revision: 206606
URL: http://svn.freebsd.org/changeset/base/206606

Log:
  MFC 205886:
  Defer freeing a kevent list until after dropping kqueue locks.

Modified:
  stable/7/sys/kern/kern_event.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/kern/kern_event.c
==============================================================================
--- stable/7/sys/kern/kern_event.c	Wed Apr 14 15:33:15 2010	(r206605)
+++ stable/7/sys/kern/kern_event.c	Wed Apr 14 15:33:30 2010	(r206606)
@@ -1110,7 +1110,7 @@ static int
 kqueue_expand(struct kqueue *kq, struct filterops *fops, uintptr_t ident,
 	int waitok)
 {
-	struct klist *list, *tmp_knhash;
+	struct klist *list, *tmp_knhash, *to_free;
 	u_long tmp_knhashmask;
 	int size;
 	int fd;
@@ -1118,6 +1118,7 @@ kqueue_expand(struct kqueue *kq, struct 
 
 	KQ_NOTOWNED(kq);
 
+	to_free = NULL;
 	if (fops->f_isfd) {
 		fd = ident;
 		if (kq->kq_knlistsize <= fd) {
@@ -1130,13 +1131,13 @@ kqueue_expand(struct kqueue *kq, struct 
 				return ENOMEM;
 			KQ_LOCK(kq);
 			if (kq->kq_knlistsize > fd) {
-				FREE(list, M_KQUEUE);
+				to_free = list;
 				list = NULL;
 			} else {
 				if (kq->kq_knlist != NULL) {
 					bcopy(kq->kq_knlist, list,
 					    kq->kq_knlistsize * sizeof list);
-					FREE(kq->kq_knlist, M_KQUEUE);
+					to_free = kq->kq_knlist;
 					kq->kq_knlist = NULL;
 				}
 				bzero((caddr_t)list +
@@ -1158,11 +1159,12 @@ kqueue_expand(struct kqueue *kq, struct 
 				kq->kq_knhash = tmp_knhash;
 				kq->kq_knhashmask = tmp_knhashmask;
 			} else {
-				free(tmp_knhash, M_KQUEUE);
+				to_free = tmp_knhash;
 			}
 			KQ_UNLOCK(kq);
 		}
 	}
+	free(to_free, M_KQUEUE);
 
 	KQ_NOTOWNED(kq);
 	return 0;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004141533.o3EFXVHv012457>