svn commit: r341275 - in stable/11: sys/dev/netmap tests/sys/kqueue/libkqueue
David Bright
dab at FreeBSD.org
Fri Nov 30 02:06:32 UTC 2018
Author: dab
Date: Fri Nov 30 02:06:30 2018
New Revision: 341275
URL: https://svnweb.freebsd.org/changeset/base/341275
Log:
MFC r337812,r337814,r337820,r341068:
Fix several memory leaks (r337812 & r337814).
The libkqueue tests have several places that leak memory by using an
idiom like:
puts(kevent_to_str(kevp));
Rework to save the pointer returned from kevent_to_str() and then
free() it after it has been used.
r337812 also fixed a bug in the netmap kevent code. The inclusion of
that fix was an oversight that I didn't notice until this
MFC. Reference the code review and PR here in the MFC for
completeness.
r337820 & r341068 were white-space only changes as a follow-up to
r337812 & r337814:
After r337820, which "corrected" some spaces-instead-of-tab whitespace
issues in the libkqueue tests, jmg@ pointed out that these files were
originally space-based, not tab-spaced, and so the correction should
have been to get rid of the tabs that had been introduced in previous
changes, not the spaces. This change does that. This is a whitespace
only change; no functional change is intended.
PR: 206053
Differential Revision: https://reviews.freebsd.org/D16531
Sponsored by: Dell EMC Isilon
Modified:
stable/11/sys/dev/netmap/netmap_freebsd.c
stable/11/tests/sys/kqueue/libkqueue/common.h
stable/11/tests/sys/kqueue/libkqueue/main.c
stable/11/tests/sys/kqueue/libkqueue/proc.c
stable/11/tests/sys/kqueue/libkqueue/signal.c
stable/11/tests/sys/kqueue/libkqueue/timer.c
stable/11/tests/sys/kqueue/libkqueue/user.c
stable/11/tests/sys/kqueue/libkqueue/vnode.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/dev/netmap/netmap_freebsd.c
==============================================================================
--- stable/11/sys/dev/netmap/netmap_freebsd.c Fri Nov 30 01:45:54 2018 (r341274)
+++ stable/11/sys/dev/netmap/netmap_freebsd.c Fri Nov 30 02:06:30 2018 (r341275)
@@ -778,7 +778,7 @@ netmap_kqfilter(struct cdev *dev, struct knote *kn)
kn->kn_fop = (ev == EVFILT_WRITE) ?
&netmap_wfiltops : &netmap_rfiltops;
kn->kn_hook = priv;
- knlist_add(&si->si.si_note, kn, 1);
+ knlist_add(&si->si.si_note, kn, 0);
// XXX unlock(priv)
ND("register %p %s td %p priv %p kn %p np_nifp %p kn_fp/fpop %s",
na, na->ifp->if_xname, curthread, priv, kn,
Modified: stable/11/tests/sys/kqueue/libkqueue/common.h
==============================================================================
--- stable/11/tests/sys/kqueue/libkqueue/common.h Fri Nov 30 01:45:54 2018 (r341274)
+++ stable/11/tests/sys/kqueue/libkqueue/common.h Fri Nov 30 02:06:30 2018 (r341275)
@@ -43,7 +43,7 @@
extern char *cur_test_id;
int vnode_fd;
-extern const char * kevent_to_str(struct kevent *);
+extern char * kevent_to_str(struct kevent *);
struct kevent * kevent_get(int);
struct kevent * kevent_get_timeout(int, int);
Modified: stable/11/tests/sys/kqueue/libkqueue/main.c
==============================================================================
--- stable/11/tests/sys/kqueue/libkqueue/main.c Fri Nov 30 01:45:54 2018 (r341274)
+++ stable/11/tests/sys/kqueue/libkqueue/main.c Fri Nov 30 02:06:30 2018 (r341275)
@@ -41,13 +41,16 @@ test_no_kevents(void)
int nfds;
struct timespec timeo;
struct kevent kev;
+ char *kev_str;
puts("confirming that there are no events pending");
memset(&timeo, 0, sizeof(timeo));
nfds = kevent(kqfd, NULL, 0, &kev, 1, &timeo);
if (nfds != 0) {
puts("\nUnexpected event:");
- puts(kevent_to_str(&kev));
+ kev_str = kevent_to_str(&kev);
+ puts(kev_str);
+ free(kev_str);
errx(1, "%d event(s) pending, but none expected:", nfds);
}
}
@@ -61,12 +64,15 @@ test_no_kevents_quietly(void)
int nfds;
struct timespec timeo;
struct kevent kev;
+ char *kev_str;
memset(&timeo, 0, sizeof(timeo));
nfds = kevent(kqfd, NULL, 0, &kev, 1, &timeo);
if (nfds != 0) {
puts("\nUnexpected event:");
- puts(kevent_to_str(&kev));
+ kev_str = kevent_to_str(&kev);
+ puts(kev_str);
+ free(kev_str);
errx(1, "%d event(s) pending, but none expected:", nfds);
}
}
@@ -79,7 +85,7 @@ kevent_get(int kqfd)
struct kevent *kev;
if ((kev = calloc(1, sizeof(*kev))) == NULL)
- err(1, "out of memory");
+ err(1, "out of memory");
nfds = kevent(kqfd, NULL, 0, kev, 1, NULL);
if (nfds < 1)
@@ -97,7 +103,7 @@ kevent_get_timeout(int kqfd, int seconds)
struct timespec timeout = {seconds, 0};
if ((kev = calloc(1, sizeof(*kev))) == NULL)
- err(1, "out of memory");
+ err(1, "out of memory");
nfds = kevent(kqfd, NULL, 0, kev, 1, &timeout);
if (nfds < 0) {
@@ -117,10 +123,10 @@ kevent_fflags_dump(struct kevent *kev)
#define KEVFFL_DUMP(attrib) \
if (kev->fflags & attrib) \
- strncat(buf, #attrib" ", 64);
+ strncat(buf, #attrib" ", 64);
if ((buf = calloc(1, 1024)) == NULL)
- abort();
+ abort();
/* Not every filter has meaningful fflags */
if (kev->filter == EVFILT_PROC) {
@@ -154,7 +160,7 @@ kevent_fflags_dump(struct kevent *kev)
#endif
buf[strlen(buf) - 1] = ')';
} else {
- snprintf(buf, 1024, "fflags = %x", kev->fflags);
+ snprintf(buf, 1024, "fflags = %x", kev->fflags);
}
return (buf);
@@ -167,10 +173,10 @@ kevent_flags_dump(struct kevent *kev)
#define KEVFL_DUMP(attrib) \
if (kev->flags & attrib) \
- strncat(buf, #attrib" ", 64);
+ strncat(buf, #attrib" ", 64);
if ((buf = calloc(1, 1024)) == NULL)
- abort();
+ abort();
snprintf(buf, 1024, "flags = %d (", kev->flags);
KEVFL_DUMP(EV_ADD);
@@ -193,20 +199,25 @@ kevent_flags_dump(struct kevent *kev)
}
/* Copied from ../kevent.c kevent_dump() and improved */
-const char *
+char *
kevent_to_str(struct kevent *kev)
{
char buf[512];
+ char *flags_str = kevent_flags_dump(kev);
+ char *fflags_str = kevent_fflags_dump(kev);
snprintf(&buf[0], sizeof(buf),
- "[ident=%d, filter=%d, %s, %s, data=%d, udata=%p]",
- (u_int) kev->ident,
+ "[ident=%ju, filter=%d, %s, %s, data=%jd, udata=%p]",
+ (uintmax_t) kev->ident,
kev->filter,
- kevent_flags_dump(kev),
- kevent_fflags_dump(kev),
- (int) kev->data,
+ flags_str,
+ fflags_str,
+ (uintmax_t)kev->data,
kev->udata);
+ free(flags_str);
+ free(fflags_str);
+
return (strdup(buf));
}
@@ -219,10 +230,14 @@ kevent_add(int kqfd, struct kevent *kev,
intptr_t data,
void *udata)
{
+ char *kev_str;
+
EV_SET(kev, ident, filter, flags, fflags, data, NULL);
if (kevent(kqfd, kev, 1, NULL, 0, NULL) < 0) {
+ kev_str = kevent_to_str(kev);
printf("Unable to add the following kevent:\n%s\n",
- kevent_to_str(kev));
+ kev_str);
+ free(kev_str);
err(1, "kevent(): %s", strerror(errno));
}
}
@@ -230,6 +245,9 @@ kevent_add(int kqfd, struct kevent *kev,
void
kevent_cmp(struct kevent *k1, struct kevent *k2)
{
+ char *kev1_str;
+ char *kev2_str;
+
/* XXX-
Workaround for inconsistent implementation of kevent(2)
*/
@@ -238,8 +256,12 @@ kevent_cmp(struct kevent *k1, struct kevent *k2)
k2->flags |= EV_ADD;
#endif
if (memcmp(k1, k2, sizeof(*k1)) != 0) {
+ kev1_str = kevent_to_str(k1);
+ kev2_str = kevent_to_str(k2);
printf("kevent_cmp: mismatch:\n %s !=\n %s\n",
- kevent_to_str(k1), kevent_to_str(k2));
+ kev1_str, kev2_str);
+ free(kev1_str);
+ free(kev2_str);
abort();
}
}
Modified: stable/11/tests/sys/kqueue/libkqueue/proc.c
==============================================================================
--- stable/11/tests/sys/kqueue/libkqueue/proc.c Fri Nov 30 01:45:54 2018 (r341274)
+++ stable/11/tests/sys/kqueue/libkqueue/proc.c Fri Nov 30 02:06:30 2018 (r341275)
@@ -45,7 +45,7 @@ add_and_delete(void)
struct stat s;
if (fstat(kqfd, &s) != -1)
errx(1, "kqueue inherited across fork! (%s() at %s:%d)",
- __func__, __FILE__, __LINE__);
+ __func__, __FILE__, __LINE__);
pause();
exit(2);
@@ -172,6 +172,7 @@ proc_track(int sleep_time)
int gchild_note = 0;
pid_t gchild_pid = -1;
int done = 0;
+ char *kev_str;
while (!done)
{
@@ -182,7 +183,9 @@ proc_track(int sleep_time)
if (kevp == NULL) {
done = 1;
} else {
- printf(" -- Received kevent: %s\n", kevent_to_str(kevp));
+ kev_str = kevent_to_str(kevp);
+ printf(" -- Received kevent: %s\n", kev_str);
+ free(kev_str);
if ((kevp->fflags & NOTE_CHILD) && (kevp->fflags & NOTE_EXIT)) {
errx(1, "NOTE_CHILD and NOTE_EXIT in same kevent: %s", kevent_to_str(kevp));
Modified: stable/11/tests/sys/kqueue/libkqueue/signal.c
==============================================================================
--- stable/11/tests/sys/kqueue/libkqueue/signal.c Fri Nov 30 01:45:54 2018 (r341274)
+++ stable/11/tests/sys/kqueue/libkqueue/signal.c Fri Nov 30 02:06:30 2018 (r341275)
@@ -188,12 +188,12 @@ test_kevent_signal_oneshot(void)
void
test_evfilt_signal()
{
- kqfd = kqueue();
- test_kevent_signal_add();
- test_kevent_signal_del();
- test_kevent_signal_get();
- test_kevent_signal_disable();
- test_kevent_signal_enable();
- test_kevent_signal_oneshot();
- close(kqfd);
+ kqfd = kqueue();
+ test_kevent_signal_add();
+ test_kevent_signal_del();
+ test_kevent_signal_get();
+ test_kevent_signal_disable();
+ test_kevent_signal_enable();
+ test_kevent_signal_oneshot();
+ close(kqfd);
}
Modified: stable/11/tests/sys/kqueue/libkqueue/timer.c
==============================================================================
--- stable/11/tests/sys/kqueue/libkqueue/timer.c Fri Nov 30 01:45:54 2018 (r341274)
+++ stable/11/tests/sys/kqueue/libkqueue/timer.c Fri Nov 30 02:06:30 2018 (r341275)
@@ -34,11 +34,10 @@ int kqfd;
static long
now(void)
{
-
- struct timeval tv;
+ struct timeval tv;
- gettimeofday(&tv, NULL);
- return SEC_TO_US(tv.tv_sec) + tv.tv_usec;
+ gettimeofday(&tv, NULL);
+ return SEC_TO_US(tv.tv_sec) + tv.tv_usec;
}
/* Sleep for a given number of milliseconds. The timeout is assumed to
@@ -47,13 +46,12 @@ now(void)
void
mssleep(int t)
{
+ struct timespec stime = {
+ .tv_sec = 0,
+ .tv_nsec = US_TO_NS(MS_TO_US(t)),
+ };
- struct timespec stime = {
- .tv_sec = 0,
- .tv_nsec = US_TO_NS(MS_TO_US(t)),
- };
-
- nanosleep(&stime, NULL);
+ nanosleep(&stime, NULL);
}
/* Sleep for a given number of microseconds. The timeout is assumed to
@@ -62,13 +60,12 @@ mssleep(int t)
void
ussleep(int t)
{
+ struct timespec stime = {
+ .tv_sec = 0,
+ .tv_nsec = US_TO_NS(t),
+ };
- struct timespec stime = {
- .tv_sec = 0,
- .tv_nsec = US_TO_NS(t),
- };
-
- nanosleep(&stime, NULL);
+ nanosleep(&stime, NULL);
}
void
@@ -229,16 +226,16 @@ test_update(void)
/* First set the timer to 1 second */
EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT,
- NOTE_USECONDS, SEC_TO_US(1), (void *)1);
+ NOTE_USECONDS, SEC_TO_US(1), (void *)1);
start = now();
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
/* Now reduce the timer to 1 ms */
EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT,
- NOTE_USECONDS, MS_TO_US(1), (void *)2);
+ NOTE_USECONDS, MS_TO_US(1), (void *)2);
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
/* Wait for the event */
kev.flags |= EV_CLEAR;
@@ -253,9 +250,9 @@ test_update(void)
*/
printf("timer expired after %ld us\n", elapsed);
if (elapsed < MS_TO_US(1))
- errx(1, "early timer expiration: %ld us", elapsed);
+ errx(1, "early timer expiration: %ld us", elapsed);
if (elapsed > SEC_TO_US(1))
- errx(1, "late timer expiration: %ld us", elapsed);
+ errx(1, "late timer expiration: %ld us", elapsed);
success();
}
@@ -274,9 +271,9 @@ test_update_equal(void)
/* First set the timer to 1 ms */
EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT,
- NOTE_USECONDS, MS_TO_US(1), NULL);
+ NOTE_USECONDS, MS_TO_US(1), NULL);
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
/* Sleep for a significant fraction of the timeout. */
ussleep(600);
@@ -284,7 +281,7 @@ test_update_equal(void)
/* Now re-add the timer with the same parameters */
start = now();
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
/* Wait for the event */
kev.flags |= EV_CLEAR;
@@ -299,7 +296,7 @@ test_update_equal(void)
*/
printf("timer expired after %ld us\n", elapsed);
if (elapsed < MS_TO_US(1))
- errx(1, "early timer expiration: %ld us", elapsed);
+ errx(1, "early timer expiration: %ld us", elapsed);
success();
}
@@ -318,9 +315,9 @@ test_update_expired(void)
/* Set the timer to 1ms */
EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT,
- NOTE_USECONDS, MS_TO_US(1), NULL);
+ NOTE_USECONDS, MS_TO_US(1), NULL);
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
/* Wait for 2 ms to give the timer plenty of time to expire. */
mssleep(2);
@@ -328,7 +325,7 @@ test_update_expired(void)
/* Now re-add the timer */
start = now();
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
/* Wait for the event */
kev.flags |= EV_CLEAR;
@@ -343,7 +340,7 @@ test_update_expired(void)
*/
printf("timer expired after %ld us\n", elapsed);
if (elapsed < MS_TO_US(1))
- errx(1, "early timer expiration: %ld us", elapsed);
+ errx(1, "early timer expiration: %ld us", elapsed);
/* Make sure the re-added timer does not fire. In other words,
* test that the event received above was the only event from the
@@ -370,7 +367,7 @@ test_update_periodic(void)
EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, SEC_TO_MS(1), NULL);
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
/* Retrieve the event */
kev.flags = EV_ADD | EV_CLEAR;
@@ -385,7 +382,7 @@ test_update_periodic(void)
EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, SEC_TO_MS(2), NULL);
start = now();
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
/* Retrieve the event */
kev.flags = EV_ADD | EV_CLEAR;
@@ -399,12 +396,12 @@ test_update_periodic(void)
*/
printf("timer expired after %ld us\n", elapsed);
if (elapsed < MS_TO_US(2))
- errx(1, "early timer expiration: %ld us", elapsed);
+ errx(1, "early timer expiration: %ld us", elapsed);
/* Delete the event */
kev.flags = EV_DELETE;
if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ err(1, "%s", test_id);
success();
}
@@ -432,46 +429,46 @@ test_update_timing(void)
* received is from the update and not the original timer add.
*/
for (sleeptime = MIN_SLEEP, iteration = 1;
- sleeptime < MAX_SLEEP;
- ++sleeptime, ++iteration) {
+ sleeptime < MAX_SLEEP;
+ ++sleeptime, ++iteration) {
- /* First set the timer to 1 ms */
- EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT,
- NOTE_USECONDS, MS_TO_US(1), NULL);
- if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ /* First set the timer to 1 ms */
+ EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT,
+ NOTE_USECONDS, MS_TO_US(1), NULL);
+ if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
+ err(1, "%s", test_id);
- /* Delay; the delay ranges from less than to greater than the
- * timer period.
- */
- ussleep(sleeptime);
+ /* Delay; the delay ranges from less than to greater than the
+ * timer period.
+ */
+ ussleep(sleeptime);
- /* Now re-add the timer with the same parameters */
- start = now();
- if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
- err(1, "%s", test_id);
+ /* Now re-add the timer with the same parameters */
+ start = now();
+ if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0)
+ err(1, "%s", test_id);
- /* Wait for the event */
- kev.flags |= EV_CLEAR;
- kev.fflags &= ~NOTE_USECONDS;
- kev.data = 1;
- kevent_cmp(&kev, kevent_get(kqfd));
- stop = now();
- elapsed = stop - start;
+ /* Wait for the event */
+ kev.flags |= EV_CLEAR;
+ kev.fflags &= ~NOTE_USECONDS;
+ kev.data = 1;
+ kevent_cmp(&kev, kevent_get(kqfd));
+ stop = now();
+ elapsed = stop - start;
- /* Check that the timer expired after at least 1 ms. This
- * check is to make sure that the timer re-started and that
- * the event is not from the original add of the timer.
- */
- if (elapsed < MS_TO_US(1))
- errx(1, "early timer expiration: %ld us", elapsed);
+ /* Check that the timer expired after at least 1 ms. This
+ * check is to make sure that the timer re-started and that
+ * the event is not from the original add of the timer.
+ */
+ if (elapsed < MS_TO_US(1))
+ errx(1, "early timer expiration: %ld us", elapsed);
- /* Make sure the re-added timer does not fire. In other words,
- * test that the event received above was the only event from
- * the add and re-add of the timer.
- */
- mssleep(2);
- test_no_kevents_quietly();
+ /* Make sure the re-added timer does not fire. In other words,
+ * test that the event received above was the only event from
+ * the add and re-add of the timer.
+ */
+ mssleep(2);
+ test_no_kevents_quietly();
}
success();
@@ -480,17 +477,17 @@ test_update_timing(void)
void
test_evfilt_timer()
{
- kqfd = kqueue();
- test_kevent_timer_add();
- test_kevent_timer_del();
- test_kevent_timer_get();
- test_oneshot();
- test_periodic();
- test_update();
- test_update_equal();
- test_update_expired();
- test_update_timing();
- test_update_periodic();
- disable_and_enable();
- close(kqfd);
+ kqfd = kqueue();
+ test_kevent_timer_add();
+ test_kevent_timer_del();
+ test_kevent_timer_get();
+ test_oneshot();
+ test_periodic();
+ test_update();
+ test_update_equal();
+ test_update_expired();
+ test_update_timing();
+ test_update_periodic();
+ disable_and_enable();
+ close(kqfd);
}
Modified: stable/11/tests/sys/kqueue/libkqueue/user.c
==============================================================================
--- stable/11/tests/sys/kqueue/libkqueue/user.c Fri Nov 30 01:45:54 2018 (r341274)
+++ stable/11/tests/sys/kqueue/libkqueue/user.c Fri Nov 30 02:06:30 2018 (r341275)
@@ -117,7 +117,7 @@ oneshot(void)
void
test_evfilt_user()
{
- kqfd = kqueue();
+ kqfd = kqueue();
add_and_delete();
event_wait();
@@ -125,5 +125,5 @@ test_evfilt_user()
oneshot();
/* TODO: try different fflags operations */
- close(kqfd);
+ close(kqfd);
}
Modified: stable/11/tests/sys/kqueue/libkqueue/vnode.c
==============================================================================
--- stable/11/tests/sys/kqueue/libkqueue/vnode.c Fri Nov 30 01:45:54 2018 (r341274)
+++ stable/11/tests/sys/kqueue/libkqueue/vnode.c Fri Nov 30 02:06:30 2018 (r341275)
@@ -251,16 +251,16 @@ test_kevent_vnode_dispatch(void)
void
test_evfilt_vnode()
{
- kqfd = kqueue();
- test_kevent_vnode_add();
- test_kevent_vnode_del();
- test_kevent_vnode_disable_and_enable();
+ kqfd = kqueue();
+ test_kevent_vnode_add();
+ test_kevent_vnode_del();
+ test_kevent_vnode_disable_and_enable();
#if HAVE_EV_DISPATCH
- test_kevent_vnode_dispatch();
+ test_kevent_vnode_dispatch();
#endif
- test_kevent_vnode_note_write();
- test_kevent_vnode_note_attrib();
- test_kevent_vnode_note_rename();
- test_kevent_vnode_note_delete();
- close(kqfd);
+ test_kevent_vnode_note_write();
+ test_kevent_vnode_note_attrib();
+ test_kevent_vnode_note_rename();
+ test_kevent_vnode_note_delete();
+ close(kqfd);
}
More information about the svn-src-stable-11
mailing list