|  | @@ -71,6 +71,7 @@ struct grpc_fd {
 | 
	
		
			
				|  |  |    int shutdown;
 | 
	
		
			
				|  |  |    int closed;
 | 
	
		
			
				|  |  |    int released;
 | 
	
		
			
				|  |  | +  gpr_atm pollhup;
 | 
	
		
			
				|  |  |    grpc_error* shutdown_error;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* The watcher list.
 | 
	
	
		
			
				|  | @@ -339,6 +340,7 @@ static grpc_fd* fd_create(int fd, const char* name) {
 | 
	
		
			
				|  |  |    r->on_done_closure = nullptr;
 | 
	
		
			
				|  |  |    r->closed = 0;
 | 
	
		
			
				|  |  |    r->released = 0;
 | 
	
		
			
				|  |  | +  gpr_atm_no_barrier_store(&r->pollhup, 0);
 | 
	
		
			
				|  |  |    r->read_notifier_pollset = nullptr;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    char* name2;
 | 
	
	
		
			
				|  | @@ -964,7 +966,8 @@ static grpc_error* pollset_work(grpc_exec_ctx* exec_ctx, grpc_pollset* pollset,
 | 
	
		
			
				|  |  |        pfds[0].events = POLLIN;
 | 
	
		
			
				|  |  |        pfds[0].revents = 0;
 | 
	
		
			
				|  |  |        for (i = 0; i < pollset->fd_count; i++) {
 | 
	
		
			
				|  |  | -        if (fd_is_orphaned(pollset->fds[i])) {
 | 
	
		
			
				|  |  | +        if (fd_is_orphaned(pollset->fds[i]) ||
 | 
	
		
			
				|  |  | +            gpr_atm_no_barrier_load(&pollset->fds[i]->pollhup) == 1) {
 | 
	
		
			
				|  |  |            GRPC_FD_UNREF(pollset->fds[i], "multipoller");
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |            pollset->fds[fd_count++] = pollset->fds[i];
 | 
	
	
		
			
				|  | @@ -1031,6 +1034,12 @@ static grpc_error* pollset_work(grpc_exec_ctx* exec_ctx, grpc_pollset* pollset,
 | 
	
		
			
				|  |  |                        pfds[i].fd, (pfds[i].revents & POLLIN_CHECK) != 0,
 | 
	
		
			
				|  |  |                        (pfds[i].revents & POLLOUT_CHECK) != 0, pfds[i].revents);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +            /* This is a mitigation to prevent poll() from spinning on a
 | 
	
		
			
				|  |  | +             ** POLLHUP https://github.com/grpc/grpc/pull/13665
 | 
	
		
			
				|  |  | +             */
 | 
	
		
			
				|  |  | +            if (pfds[i].revents & POLLHUP) {
 | 
	
		
			
				|  |  | +              gpr_atm_no_barrier_store(&watchers[i].fd->pollhup, 1);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              fd_end_poll(exec_ctx, &watchers[i], pfds[i].revents & POLLIN_CHECK,
 | 
	
		
			
				|  |  |                          pfds[i].revents & POLLOUT_CHECK, pollset);
 | 
	
		
			
				|  |  |            }
 |