Print this page
5026 intra-node/inter-zone networking doesn't always deliver SIGPOLL
@@ -20,10 +20,13 @@
*/
/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
*/
+/*
+ * Copyright 2014, OmniTI Computer Consulting, Inc. All rights reserved.
+ */
#include <sys/types.h>
#include <sys/param.h>
#include <sys/signal.h>
#include <sys/cmn_err.h>
@@ -394,11 +397,16 @@
* XXX This unfortunately still generates
* a signal when a fd is closed but
* the proc is active.
*/
mutex_enter(&pidlock);
- proc = prfind(so->so_pgrp);
+ /*
+ * Even if the thread started in another zone, we're receiving
+ * on behalf of this socket's zone, so find the proc using the
+ * socket's zone ID.
+ */
+ proc = prfind_zone(so->so_pgrp, so->so_zoneid);
if (proc == NULL) {
mutex_exit(&pidlock);
return;
}
mutex_enter(&proc->p_lock);
@@ -411,11 +419,16 @@
* calls to socket_sigproc().
*/
pid_t pgrp = -so->so_pgrp;
mutex_enter(&pidlock);
- proc = pgfind(pgrp);
+ /*
+ * Even if the thread started in another zone, we're receiving
+ * on behalf of this socket's zone, so find the pgrp using the
+ * socket's zone ID.
+ */
+ proc = pgfind_zone(pgrp, so->so_zoneid);
while (proc != NULL) {
mutex_enter(&proc->p_lock);
socket_sigproc(proc, event);
mutex_exit(&proc->p_lock);
proc = proc->p_pglink;