[openib-general] [PATCH] for review to timeout send MADs

Roland Dreier
Wed Oct 6 17:41:29 PDT 2004


    Sean> A workqueue is used to schedule delayed processing of MAD
    Sean> timeouts.  The scheduling delay of the timeout thread is
    Sean> adjusted when a send completes or is canceled.  If anyone
    Sean> sees an issue with my usage of the workqueue, just let me
    Sean> know.

It seems you are using the system-wide keventd queue.  This isn't
necessarily a problem per se, but it would probably be better to use a
MAD-layer private workqueue (I suggested a single-threaded workqueue
per MAD "port" earlier).  This avoids two problems.  First, keventd is
subject to arbitrary delays because it is used as a dumping ground for
any code that needs to sleep.  Second, if the MAD layer has its own
workqueue, then it can be used for completion processing as well; as
it stands it seems sort of funny to create a kthread to do some work
and run other work from a workqueue.

A few low-level comments too:

                rbuf = list_entry(&port_priv->recv_posted_mad_list[qpn],
-                                struct ib_mad_recv_buf,
-                                list);
-               rbuf = (struct ib_mad_recv_buf *)rbuf->list.next;
+                                 struct ib_mad_recv_buf,
+                                 list);
+               rbuf = (struct ib_mad_recv_buf*)rbuf->list.next;

I don't understand what's going on here; can this not be written as:

                rbuf = list_entry(port_priv->recv_posted_mad_list[qpn].next,
                                  struct ib_mad_recv_buf, list);

(By the way the cast should be written with spaces as:
        (struct ib_mad_recv_buf *) rbuf->list.next)

This patch seems whitespace-challenged in other places too:

-               recv = container_of(mad_priv_hdr, struct ib_mad_private, header);
+               recv = container_of(mad_priv_hdr,struct ib_mad_private,header);

and has extra empty lines places like here:

+               if (time_after(mad_agent_priv->timeout, mad_send_wr->timeout)) {
+
+                       mad_agent_priv->timeout = mad_send_wr->timeout;

and here:

+       if (list_empty(&mad_agent_priv->wait_list)) {
+               cancel_delayed_work(&mad_agent_priv->work);
+       } else {
+
+               mad_send_wr = list_entry(mad_agent_priv->wait_list.next,


More information about the openib-general mailing list