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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to