[xserver,2/2] os: Add epoll-like port implementation for Solaris

Submitted by Alan Coopersmith on Sept. 23, 2019, 7:19 p.m.

Details

Message ID 29dee8a0-f258-98e4-fb9a-98be2a10c76f@oracle.com
State New
Headers show
Series "Series without cover letter" ( rev: 2 ) in X.org

Not browsing as part of any series.

Commit Message

Alan Coopersmith Sept. 23, 2019, 7:19 p.m.
On 10/12/17 1:48 PM, Peter Harris wrote:
> x11perf -noop with 200 xlogos connected is slightly faster with ports:
> 
>    before           after         Operation
> ----------   -----------------   --------------------
> 18400000.0   19200000.0 (1.04)   X protocol NoOperation

Is the version you tested with a different revision of the code than what
got pushed?  After finally getting Xorg to build on Solaris 11.4 with meson,
I found that the code in git master doesn't build.  (I'd never noticed before
since it's not hooked up in autoconf, only meson.)

The changes I needed to compile follow - tested briefly in Xnest
with xev, xterm, & x11perf -noop without seeing any problems.

	-Alan Coopersmith-               alan.coopersmith@oracle.com
	 Oracle Solaris Engineering - https://blogs.oracle.com/alanc

Patch hide | download patch | download mbox

diff --git a/os/ospoll.c b/os/ospoll.c
index db9e73811..c68aabc87 100644
--- a/os/ospoll.c
+++ b/os/ospoll.c
@@ -40,6 +40,7 @@ 

  #if !HAVE_OSPOLL && defined(HAVE_PORT_CREATE)
  #include <port.h>
+#include <poll.h>
  #define PORT            1
  #define HAVE_OSPOLL     1
  #endif
@@ -78,7 +79,6 @@  struct ospoll {
  #endif

  #if EPOLL || PORT
-#include <sys/epoll.h>

  /* epoll-based implementation */
  struct ospollfd {
@@ -468,10 +468,10 @@  epoll_mod(struct ospoll *ospoll, struct ospollfd *osfd)
  {
      int events = 0;
      if (osfd->xevents & X_NOTIFY_READ)
-        events |= EPOLLIN;
+        events |= POLLIN;
      if (osfd->xevents & X_NOTIFY_WRITE)
-        events |= EPOLLOUT;
-    port_associate(ospool->epoll_fd, PORT_SOURCE_FD, osfd->fd, events, osfd);
+        events |= POLLOUT;
+    port_associate(ospoll->epoll_fd, PORT_SOURCE_FD, osfd->fd, events, osfd);
  }
  #endif

@@ -601,9 +601,14 @@  ospoll_wait(struct ospoll *ospoll, int timeout)
  #define MAX_EVENTS      256
      port_event_t events[MAX_EVENTS];
      uint_t nget = 1;
+    timespec_t port_timeout = {
+        .tv_sec = timeout / 1000,
+        .tv_nsec = (timeout % 1000) * 1000000
+    };

      nready = 0;
-    if (port_getn(ospoll->epoll_fd, events, MAX_EVENTS, &nget, &timeout) == 0) {
+    if (port_getn(ospoll->epoll_fd, events, MAX_EVENTS, &nget, &port_timeout)
+        == 0) {
          nready = nget;
      }
      for (int i = 0; i < nready; i++) {
@@ -612,17 +617,18 @@  ospoll_wait(struct ospoll *ospoll, int timeout)
          uint32_t revents = ev->portev_events;
          int xevents = 0;

-        if (revents & EPOLLIN)
+        if (revents & POLLIN)
              xevents |= X_NOTIFY_READ;
-        if (revents & EPOLLOUT)
+        if (revents & POLLOUT)
              xevents |= X_NOTIFY_WRITE;
-        if (revents & (~(EPOLLIN|EPOLLOUT)))
+        if (revents & (~(POLLIN|POLLOUT)))
              xevents |= X_NOTIFY_ERROR;

          if (osfd->callback)
              osfd->callback(osfd->fd, xevents, osfd->data);

-        if (osfd->trigger == ospoll_trigger_level && !osfd->deleted) {
+        if (osfd->trigger == ospoll_trigger_level &&
+            !xorg_list_is_empty(&osfd->deleted)) {
              epoll_mod(ospoll, osfd);
          }
      }

Comments

On 2019-09-23 Alan Coopersmith wrote:
> On 10/12/17 1:48 PM, Peter Harris wrote:

> > x11perf -noop with 200 xlogos connected is slightly faster with ports:

> >

> >    before           after         Operation

> > ----------   -----------------   --------------------

> > 18400000.0   19200000.0 (1.04)   X protocol NoOperation

> 

> Is the version you tested with a different revision of the code than what got

> pushed?  After finally getting Xorg to build on Solaris 11.4 with meson, I found

> that the code in git master doesn't build.  (I'd never noticed before since it's not

> hooked up in autoconf, only meson.)


Well, that's embarrassing. It looks like I never tested the version I sent to X.org, due to a typo in my make file. (We use neither autoconf nor meson, although we should be switching to meson soon).

> The changes I needed to compile follow - tested briefly in Xnest with xev, xterm,

> & x11perf -noop without seeing any problems.


These changes look good to me.

Sorry about that.

Peter Harris