[PATCH xserver 04/24] Remove non-smart scheduler. Don't require setitimer.

Daniel Martin consume.noise at gmail.com
Mon Sep 21 01:11:11 PDT 2015


On 21 September 2015 at 08:16, Keith Packard <keithp at keithp.com> wrote:
> This allows the server to call GetTimeInMillis() after each request is
> processed to avoid needing setitimer. -dumbSched now turns off the
> setitimer.
>
> Signed-off-by: Keith Packard <keithp at keithp.com>
> ---
>  configure.ac            |  2 +-
>  dix/dispatch.c          | 17 +++++++++++------
>  include/dix-config.h.in |  3 +++
>  include/dixstruct.h     |  4 +++-
>  os/WaitFor.c            | 14 ++++----------
>  os/io.c                 | 13 ++-----------
>  os/utils.c              | 23 ++++++++++++-----------
>  7 files changed, 36 insertions(+), 40 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index 8d6a950..ec6b1a7 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -218,7 +218,7 @@ AC_SUBST(DLOPEN_LIBS)
>  dnl Checks for library functions.
>  AC_CHECK_FUNCS([backtrace ffs geteuid getuid issetugid getresuid \
>         getdtablesize getifaddrs getpeereid getpeerucred getprogname getzoneid \
> -       mmap seteuid shmctl64 strncasecmp vasprintf vsnprintf walkcontext])
> +       mmap seteuid shmctl64 strncasecmp vasprintf vsnprintf walkcontext setitimer])
>  AC_REPLACE_FUNCS([reallocarray strcasecmp strcasestr strlcat strlcpy strndup])
>
>  AC_CHECK_DECLS([program_invocation_short_name], [], [], [[#include <errno.h>]])
> diff --git a/dix/dispatch.c b/dix/dispatch.c
> index 2c20124..aa4ec7c 100644
> --- a/dix/dispatch.c
> +++ b/dix/dispatch.c
> @@ -222,11 +222,13 @@ UpdateCurrentTimeIf(void)
>  #define SMART_SCHEDULE_DEFAULT_INTERVAL        5
>  #define SMART_SCHEDULE_MAX_SLICE       15
>
> -#if defined(WIN32) && !defined(__CYGWIN__)
> -Bool SmartScheduleDisable = TRUE;
> +#ifdef HAVE_SETITIMER
> +#define SMART_SCHEDULE_DEFAULT_SIGNAL_ENABLE HAVE_SETITIMER
>  #else
> -Bool SmartScheduleDisable = FALSE;
> +#define SMART_SCHEDULE_DEFAULT_SIGNAL_ENABLE FALSE
>  #endif
> +
> +Bool SmartScheduleSignalEnable = SMART_SCHEDULE_DEFAULT_SIGNAL_ENABLE;

FACK (Full ACK) ;) for inverting that variable! I always appreciate
such changes.

>  long SmartScheduleSlice = SMART_SCHEDULE_DEFAULT_INTERVAL;
>  long SmartScheduleInterval = SMART_SCHEDULE_DEFAULT_INTERVAL;
>  long SmartScheduleMaxSlice = SMART_SCHEDULE_MAX_SLICE;
> @@ -358,7 +360,7 @@ Dispatch(void)
>
>          nready = WaitForSomething(clientReady);
>
> -        if (nready && !SmartScheduleDisable) {
> +        if (nready) {
>              clientReady[0] = SmartScheduleClient(clientReady, nready);
>              nready = 1;
>          }
> @@ -386,8 +388,8 @@ Dispatch(void)
>                      ProcessInputEvents();
>
>                  FlushIfCriticalOutputPending();
> -                if (!SmartScheduleDisable &&
> -                    (SmartScheduleTime - start_tick) >= SmartScheduleSlice) {
> +                if ((SmartScheduleTime - start_tick) >= SmartScheduleSlice)
> +                {
>                      /* Penalize clients which consume ticks */
>                      if (client->smart_priority > SMART_MIN_PRIORITY)
>                          client->smart_priority--;
> @@ -431,6 +433,9 @@ Dispatch(void)
>                              (*client->requestVector[client->majorOp]) (client);
>                      XaceHookAuditEnd(client, result);
>                  }
> +                if (!SmartScheduleSignalEnable)
> +                    SmartScheduleTime = GetTimeInMillis();
> +
>  #ifdef XSERVER_DTRACE
>                  if (XSERVER_REQUEST_DONE_ENABLED())
>                      XSERVER_REQUEST_DONE(LookupMajorName(client->majorOp),
> diff --git a/include/dix-config.h.in b/include/dix-config.h.in
> index c2ba434..c0cb25a 100644
> --- a/include/dix-config.h.in
> +++ b/include/dix-config.h.in
> @@ -518,4 +518,7 @@
>  /* Listen on local socket */
>  #undef LISTEN_LOCAL
>
> +/* Have setitimer support */
> +#undef HAVE_SETITIMER
> +
>  #endif /* _DIX_CONFIG_H_ */
> diff --git a/include/dixstruct.h b/include/dixstruct.h
> index 7575066..1bf1949 100644
> --- a/include/dixstruct.h
> +++ b/include/dixstruct.h
> @@ -130,9 +130,11 @@ extern long SmartScheduleTime;
>  extern long SmartScheduleInterval;
>  extern long SmartScheduleSlice;
>  extern long SmartScheduleMaxSlice;
> -extern Bool SmartScheduleDisable;
> +extern Bool SmartScheduleSignalEnable;
> +#if HAVE_SETITIMER
>  extern void SmartScheduleStartTimer(void);
>  extern void SmartScheduleStopTimer(void);
> +#endif
>
>  #define SMART_MAX_PRIORITY  (20)
>  #define SMART_MIN_PRIORITY  (-20)
> diff --git a/os/WaitFor.c b/os/WaitFor.c
> index 431f1a6..424cdfc 100644
> --- a/os/WaitFor.c
> +++ b/os/WaitFor.c
> @@ -174,16 +174,10 @@ WaitForSomething(int *pClientsReady)
>          if (workQueue)
>              ProcessWorkQueue();
>          if (XFD_ANYSET(&ClientsWithInput)) {
> -            if (!SmartScheduleDisable) {
> -                someReady = TRUE;
> -                waittime.tv_sec = 0;
> -                waittime.tv_usec = 0;
> -                wt = &waittime;
> -            }
> -            else {
> -                XFD_COPYSET(&ClientsWithInput, &clientsReadable);
> -                break;
> -            }
> +            someReady = TRUE;
> +            waittime.tv_sec = 0;
> +            waittime.tv_usec = 0;
> +            wt = &waittime;
>          }
>          if (someReady) {
>              XFD_COPYSET(&AllSockets, &LastSelectMask);
> diff --git a/os/io.c b/os/io.c
> index 96a243d..864f44a 100644
> --- a/os/io.c
> +++ b/os/io.c
> @@ -462,23 +462,14 @@ ReadRequestFromClient(ClientPtr client)
>              )
>              FD_SET(fd, &ClientsWithInput);
>          else {
> -            if (!SmartScheduleDisable)
> -                FD_CLR(fd, &ClientsWithInput);
> -            else
> -                YieldControlNoInput(fd);
> +            FD_CLR(fd, &ClientsWithInput);
>          }
>      }
>      else {
>          if (!gotnow)
>              AvailableInput = oc;
> -        if (!SmartScheduleDisable)
> -            FD_CLR(fd, &ClientsWithInput);
> -        else
> -            YieldControlNoInput(fd);
> +        FD_CLR(fd, &ClientsWithInput);
>      }
> -    if (SmartScheduleDisable)
> -        if (++timesThisConnection >= MAX_TIMES_PER)
> -            YieldControl();
>      if (move_header) {
>          request = (xReq *) oci->bufptr;
>          oci->bufptr += (sizeof(xBigReq) - sizeof(xReq));
> diff --git a/os/utils.c b/os/utils.c
> index 868eb04..c23c0d1 100644
> --- a/os/utils.c
> +++ b/os/utils.c
> @@ -71,7 +71,6 @@ __stdcall unsigned long GetTickCount(void);
>  #if !defined(WIN32) || !defined(__MINGW32__)
>  #include <sys/time.h>
>  #include <sys/resource.h>
> -# define SMART_SCHEDULE_POSSIBLE
>  #endif
>  #include "misc.h"
>  #include <X11/X.h>
> @@ -1005,10 +1004,11 @@ ProcessCommandLine(int argc, char *argv[])
>              i = skip - 1;
>          }
>  #endif
> -#ifdef SMART_SCHEDULE_POSSIBLE
> +#if HAVE_SETITIMER
>          else if (strcmp(argv[i], "-dumbSched") == 0) {
> -            SmartScheduleDisable = TRUE;
> +            SmartScheduleSignalEnable = FALSE;
>          }
> +#endif
>          else if (strcmp(argv[i], "-schedInterval") == 0) {
>              if (++i < argc) {
>                  SmartScheduleInterval = atoi(argv[i]);
> @@ -1024,7 +1024,6 @@ ProcessCommandLine(int argc, char *argv[])
>              else
>                  UseMsg();
>          }
> -#endif
>          else if (strcmp(argv[i], "-render") == 0) {
>              if (++i < argc) {
>                  int policy = PictureParseCmapPolicy(argv[i]);
> @@ -1208,10 +1207,10 @@ XNFstrdup(const char *s)
>  void
>  SmartScheduleStopTimer(void)
>  {
> -#ifdef SMART_SCHEDULE_POSSIBLE
> +#if HAVE_SETITIMER
>      struct itimerval timer;
>
> -    if (SmartScheduleDisable)
> +    if (!SmartScheduleSignalEnable)
>          return;
>      timer.it_interval.tv_sec = 0;
>      timer.it_interval.tv_usec = 0;
> @@ -1224,10 +1223,10 @@ SmartScheduleStopTimer(void)
>  void
>  SmartScheduleStartTimer(void)
>  {
> -#ifdef SMART_SCHEDULE_POSSIBLE
> +#if HAVE_SETITIMER
>      struct itimerval timer;
>
> -    if (SmartScheduleDisable)
> +    if (!SmartScheduleSignalEnable)
>          return;
>      timer.it_interval.tv_sec = 0;
>      timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
> @@ -1237,19 +1236,21 @@ SmartScheduleStartTimer(void)
>  #endif
>  }
>
> +#if HAVE_SETITIMER
>  static void
>  SmartScheduleTimer(int sig)
>  {
>      SmartScheduleTime += SmartScheduleInterval;
>  }
> +#endif
>
>  void
>  SmartScheduleInit(void)
>  {
> -#ifdef SMART_SCHEDULE_POSSIBLE
> +#if HAVE_SETITIMER
>      struct sigaction act;
>
> -    if (SmartScheduleDisable)
> +    if (!SmartScheduleSignalEnable)
>          return;
>
>      memset((char *) &act, 0, sizeof(struct sigaction));
> @@ -1260,7 +1261,7 @@ SmartScheduleInit(void)
>      sigaddset(&act.sa_mask, SIGALRM);
>      if (sigaction(SIGALRM, &act, 0) < 0) {
>          perror("sigaction for smart scheduler");
> -        SmartScheduleDisable = TRUE;
> +        SmartScheduleSignalEnable = FALSE;
>      }
>  #endif
>  }
> --
> 2.5.0
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list