From patchwork Wed Aug 1 16:49:48 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chuck Lever X-Patchwork-Id: 1265411 Return-Path: X-Original-To: patchwork-linux-nfs@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 972DF3FC71 for ; Wed, 1 Aug 2012 16:49:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751662Ab2HAQty (ORCPT ); Wed, 1 Aug 2012 12:49:54 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:63594 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751105Ab2HAQtx (ORCPT ); Wed, 1 Aug 2012 12:49:53 -0400 Received: by pbbrp8 with SMTP id rp8so1347455pbb.19 for ; Wed, 01 Aug 2012 09:49:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:subject:to:cc:date:message-id:user-agent:mime-version :content-type:content-transfer-encoding; bh=Hsv+p/Upl1eqQF8vexWYNn1R9MEkrCQQ8GluGj/CyCY=; b=n51fRtKson85aK3c15JzI2+rS8qBA0SNAklj2nSDRncs5xVCs08dAdt8+2IUupD48k /LIzimcFusKoyJcRDAtT6amLa2u8Fq+IR6aJXiiXUnbjKTo2U0WpZHhmhEq0OAhpF3jG xq3BX7LXGdWLEltMv+1sMyNDKDmqqHxE/hYdhvFCntfD6adS+CJuKfPGWzu5rG64N/Os 1Be6tLv06tLAKC29nGS4JJD7aqRK9rTp/FO4mziI7fGG/YZNewKo+VUckXllX4pYgcj/ xqAGks18gzvx4ZWth21EUGj+qjT4+sQ4tZpx6CSYBqjs0MNJklNq3LYpMAWV5TAqUL8M 0YPw== Received: by 10.68.227.198 with SMTP id sc6mr53046749pbc.138.1343839792780; Wed, 01 Aug 2012 09:49:52 -0700 (PDT) Received: from seurat.1015granger.net ([2001:df8:0:16:20c:29ff:fe93:815b]) by mx.google.com with ESMTPS id gh9sm2912021pbc.20.2012.08.01.09.49.49 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 01 Aug 2012 09:49:51 -0700 (PDT) From: Chuck Lever Subject: [PATCH] rpc.gssd: don't call poll(2) twice a second To: bfields@redhat.com Cc: linux-nfs@vger.kernel.org Date: Wed, 01 Aug 2012 12:49:48 -0400 Message-ID: <20120801164738.27815.94008.stgit@seurat.1015granger.net> User-Agent: StGIT/0.14.3 MIME-Version: 1.0 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org Use ppoll() instead. [ cel Wed Aug 1 11:44:46 EDT 2012 - autoconfiscated Bruce's version ] Related clean-up: Since we're pulling the poll/ppoll call out into a separate function, note that the second argument of poll(2) and ppoll(2) is not an int, it's an unsigned long. The nfds_t typedef is a recent invention, so use the raw type for compatibility with older glibc headers. Signed-off-by: Chuck Lever --- Bruce- How does this strike you? I've build-tested both arms of the HAVE_PPOLL #ifdef, but otherwise have done no further testing. configure.ac | 2 +- utils/gssd/gssd_main_loop.c | 56 +++++++++++++++++++++++++++++++------------ utils/gssd/gssd_proc.c | 2 +- 3 files changed, 42 insertions(+), 18 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/configure.ac b/configure.ac index b408f1b..18ee11a 100644 --- a/configure.ac +++ b/configure.ac @@ -392,7 +392,7 @@ AC_CHECK_FUNCS([alarm atexit dup2 fdatasync ftruncate getcwd \ gethostbyaddr gethostbyname gethostname getmntent \ getnameinfo getrpcbyname getifaddrs \ gettimeofday hasmntopt inet_ntoa innetgr memset mkdir pathconf \ - realpath rmdir select socket strcasecmp strchr strdup \ + ppoll realpath rmdir select socket strcasecmp strchr strdup \ strerror strrchr strtol strtoul sigprocmask]) diff --git a/utils/gssd/gssd_main_loop.c b/utils/gssd/gssd_main_loop.c index cec09ea..22e082f 100644 --- a/utils/gssd/gssd_main_loop.c +++ b/utils/gssd/gssd_main_loop.c @@ -55,7 +55,7 @@ #include "err_util.h" extern struct pollfd *pollarray; -extern int pollsize; +extern unsigned long pollsize; #define POLL_MILLISECS 500 @@ -99,7 +99,7 @@ scan_poll_results(int ret) break; } } -}; +} static int topdirs_add_entry(struct dirent *dent) @@ -175,10 +175,46 @@ out_err: return -1; } +#ifdef HAVE_PPOLL +static void gssd_poll(struct pollfd *fds, unsigned long nfds) +{ + sigset_t emptyset; + int ret; + + sigemptyset(&emptyset); + ret = ppoll(fds, nfds, NULL, &emptyset); + if (ret < 0) { + if (errno != EINTR) + printerr(0, "WARNING: error return from poll\n"); + } else if (ret == 0) { + printerr(0, "WARNING: unexpected timeout\n"); + } else { + scan_poll_results(ret); + } +} +#else /* !HAVE_PPOLL */ +static void gssd_poll(struct pollfd *fds, unsigned long nfds) +{ + int ret; + + /* race condition here: dir_changed could be set before we + * enter the poll, and we'd never notice if it weren't for the + * timeout. */ + ret = poll(fds, nfds, POLL_MILLISECS); + if (ret < 0) { + if (errno != EINTR) + printerr(0, "WARNING: error return from poll\n"); + } else if (ret == 0) { + /* timeout */ + } else { /* ret > 0 */ + scan_poll_results(ret); + } +} +#endif /* !HAVE_PPOLL */ + void gssd_run() { - int ret; struct sigaction dn_act; sigset_t set; @@ -207,19 +243,7 @@ gssd_run() exit(1); } } - /* race condition here: dir_changed could be set before we - * enter the poll, and we'd never notice if it weren't for the - * timeout. */ - ret = poll(pollarray, pollsize, POLL_MILLISECS); - if (ret < 0) { - if (errno != EINTR) - printerr(0, - "WARNING: error return from poll\n"); - } else if (ret == 0) { - /* timeout */ - } else { /* ret > 0 */ - scan_poll_results(ret); - } + gssd_poll(pollarray, pollsize); } topdirs_free_list(); diff --git a/utils/gssd/gssd_proc.c b/utils/gssd/gssd_proc.c index aa39435..bda0249 100644 --- a/utils/gssd/gssd_proc.c +++ b/utils/gssd/gssd_proc.c @@ -104,7 +104,7 @@ struct pollfd * pollarray; -int pollsize; /* the size of pollaray (in pollfd's) */ +unsigned long pollsize; /* the size of pollaray (in pollfd's) */ /* * convert a presentation address string to a sockaddr_storage struct. Returns