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;