Skip to content

Commit

Permalink
Merge branch 'freebsd/11-stable/master' into hardened/11-stable/master
Browse files Browse the repository at this point in the history
* freebsd/11-stable/master:
  MFC r325044: Fix a lock leak in g_mirror_destroy().
  Add support for IPv6 based addresses as part of the TCP unify portspace feature in ibcore. This resolves an interopability issue when using both iWarp(T6) and RDMA(CX-4 and CX-5) devices at the same time.
  MFC r326134: Duplicate helpers after disabling inherited tracepoints during a fork.
  MFC r326371: Verify the object/vnode association after vget() in vm_pageout_clean().
  MFC r326286: Don't use pcpu_find() to determine if a CPU ID is valid.
  • Loading branch information
opntr-auto committed Dec 8, 2017
2 parents 605e4a6 + eaca327 commit 69d7dec
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 34 deletions.
22 changes: 8 additions & 14 deletions sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
Expand Up @@ -600,35 +600,24 @@ fasttrap_fork(proc_t *p, proc_t *cp)
pid_t ppid = p->p_pid;
int i;

#ifdef illumos
ASSERT(curproc == p);
#ifdef illumos
ASSERT(p->p_proc_flag & P_PR_LOCK);
#else
PROC_LOCK_ASSERT(p, MA_OWNED);
#endif
#ifdef illumos
ASSERT(p->p_dtrace_count > 0);
#else
if (p->p_dtrace_helpers) {
/*
* dtrace_helpers_duplicate() allocates memory.
*/
_PHOLD(cp);
PROC_UNLOCK(p);
PROC_UNLOCK(cp);
dtrace_helpers_duplicate(p, cp);
PROC_LOCK(cp);
PROC_LOCK(p);
_PRELE(cp);
}
/*
* This check is purposely here instead of in kern_fork.c because,
* for legal resons, we cannot include the dtrace_cddl.h header
* inside kern_fork.c and insert if-clause there.
*/
if (p->p_dtrace_count == 0)
if (p->p_dtrace_count == 0 && p->p_dtrace_helpers == NULL)
return;
#endif

ASSERT(cp->p_dtrace_count == 0);

/*
Expand Down Expand Up @@ -657,6 +646,8 @@ fasttrap_fork(proc_t *p, proc_t *cp)
_PHOLD(cp);
PROC_UNLOCK(cp);
PROC_UNLOCK(p);
if (p->p_dtrace_count == 0)
goto dup_helpers;
#endif

/*
Expand Down Expand Up @@ -710,6 +701,9 @@ fasttrap_fork(proc_t *p, proc_t *cp)
mutex_enter(&cp->p_lock);
sprunlock(cp);
#else
dup_helpers:
if (p->p_dtrace_helpers != NULL)
dtrace_helpers_duplicate(p, cp);
PROC_LOCK(p);
PROC_LOCK(cp);
_PRELE(cp);
Expand Down
10 changes: 2 additions & 8 deletions sys/cddl/dev/dtrace/dtrace_ioctl.c
Expand Up @@ -236,9 +236,7 @@ dtrace_ioctl(struct cdev *dev, u_long cmd, caddr_t addr,
"DTRACEIOC_AGGSNAP":"DTRACEIOC_BUFSNAP",
curcpu, desc.dtbd_cpu);

if (desc.dtbd_cpu >= NCPU)
return (ENOENT);
if (pcpu_find(desc.dtbd_cpu) == NULL)
if (desc.dtbd_cpu >= MAXCPU || CPU_ABSENT(desc.dtbd_cpu))
return (ENOENT);

mutex_enter(&dtrace_lock);
Expand Down Expand Up @@ -801,11 +799,7 @@ dtrace_ioctl(struct cdev *dev, u_long cmd, caddr_t addr,
nerrs = state->dts_errors;
dstate = &state->dts_vstate.dtvs_dynvars;

for (i = 0; i < NCPU; i++) {
#ifndef illumos
if (pcpu_find(i) == NULL)
continue;
#endif
CPU_FOREACH(i) {
dtrace_dstate_percpu_t *dcpu = &dstate->dtds_percpu[i];

stat->dtst_dyndrops += dcpu->dtdsc_drops;
Expand Down
4 changes: 3 additions & 1 deletion sys/geom/mirror/g_mirror.c
Expand Up @@ -3088,8 +3088,10 @@ g_mirror_destroy(struct g_mirror_softc *sc, int how)
}
}

if ((sc->sc_flags & G_MIRROR_DEVICE_FLAG_DESTROY) != 0)
if ((sc->sc_flags & G_MIRROR_DEVICE_FLAG_DESTROY) != 0) {
sx_xunlock(&sc->sc_lock);
return (0);
}
sc->sc_flags |= G_MIRROR_DEVICE_FLAG_DESTROY;
sc->sc_flags |= G_MIRROR_DEVICE_FLAG_DRAIN;
G_MIRROR_DEBUG(4, "%s: Waking up %p.", __func__, sc);
Expand Down
27 changes: 16 additions & 11 deletions sys/ofed/drivers/infiniband/core/cma.c
Expand Up @@ -2569,32 +2569,37 @@ static int cma_get_tcp_port(struct rdma_id_private *id_priv)
int ret;
int size;
struct socket *sock;
struct sockaddr *src_addr = (struct sockaddr *)&id_priv->id.route.addr.src_addr;

ret = sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
switch (src_addr->sa_family) {
case AF_INET:
case AF_INET6:
break;
default:
/* other address families are not handled by iWarp */
id_priv->unify_ps_tcp = 0;
return (0);
}

ret = sock_create_kern(src_addr->sa_family, SOCK_STREAM, IPPROTO_TCP, &sock);
if (ret)
return ret;
#ifdef __linux__
ret = sock->ops->bind(sock,
(struct sockaddr *) &id_priv->id.route.addr.src_addr,
ip_addr_size((struct sockaddr *) &id_priv->id.route.addr.src_addr));
ret = sock->ops->bind(sock, src_addr, ip_addr_size(src_addr));
#else
SOCK_LOCK(sock);
sock->so_options |= SO_REUSEADDR;
SOCK_UNLOCK(sock);

ret = -sobind(sock,
(struct sockaddr *)&id_priv->id.route.addr.src_addr,
curthread);
ret = -sobind(sock, src_addr, curthread);
#endif
if (ret) {
sock_release(sock);
return ret;
}

size = ip_addr_size((struct sockaddr *) &id_priv->id.route.addr.src_addr);
ret = sock_getname(sock,
(struct sockaddr *) &id_priv->id.route.addr.src_addr,
&size, 0);
size = ip_addr_size(src_addr);
ret = sock_getname(sock, src_addr, &size, 0);
if (ret) {
sock_release(sock);
return ret;
Expand Down
10 changes: 10 additions & 0 deletions sys/vm/vm_pageout.c
Expand Up @@ -617,7 +617,17 @@ vm_pageout_clean(vm_page_t m, int *numpagedout)
goto unlock_mp;
}
VM_OBJECT_WLOCK(object);

/*
* Ensure that the object and vnode were not disassociated
* while locks were dropped.
*/
if (vp->v_object != object) {
error = ENOENT;
goto unlock_all;
}
vm_page_lock(m);

/*
* While the object and page were unlocked, the page
* may have been:
Expand Down

0 comments on commit 69d7dec

Please sign in to comment.