diff mbox series

[v2,1/2] argo: warn sendv() caller when ring is full

Message ID fb83896f3b399c7ace3292f38506812bc4616f6d.1560286430.git.tsirakisn@ainfosec.com (mailing list archive)
State New, archived
Headers show
Series [v2,1/2] argo: warn sendv() caller when ring is full | expand

Commit Message

Nicholas Tsirakis June 11, 2019, 9:14 p.m. UTC
In its current state, if the destination ring is full, sendv()
will requeue the message and return the rc of pending_requeue(),
which will return 0 on success. This prevents the caller from
distinguishing the difference between a successful write and a
message that needs to be resent at a later time.

Instead, capture the -EAGAIN value returned from ringbuf_insert()
and *only* overwrite it if the rc of pending_requeue() is non-zero.
This allows the caller to make intelligent decisions on -EAGAIN and
still be alerted if the pending message fails to requeue.

Signed-off-by: Nicholas Tsirakis <tsirakisn@ainfosec.com>
---
 xen/common/argo.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Christopher Clark June 11, 2019, 11:15 p.m. UTC | #1
On Tue, Jun 11, 2019 at 2:14 PM Nicholas Tsirakis
<niko.tsirakis@gmail.com> wrote:
>
> In its current state, if the destination ring is full, sendv()
> will requeue the message and return the rc of pending_requeue(),
> which will return 0 on success. This prevents the caller from
> distinguishing the difference between a successful write and a
> message that needs to be resent at a later time.
>
> Instead, capture the -EAGAIN value returned from ringbuf_insert()
> and *only* overwrite it if the rc of pending_requeue() is non-zero.
> This allows the caller to make intelligent decisions on -EAGAIN and
> still be alerted if the pending message fails to requeue.
>
> Signed-off-by: Nicholas Tsirakis <tsirakisn@ainfosec.com>

This patch has already been approved and applied; so no need to resend
it again, thanks.

Christopher
diff mbox series

Patch

diff --git a/xen/common/argo.c b/xen/common/argo.c
index 13052b9239..2f874a570d 100644
--- a/xen/common/argo.c
+++ b/xen/common/argo.c
@@ -2048,9 +2048,13 @@  sendv(struct domain *src_d, xen_argo_addr_t *src_addr,
                              message_type, &len);
         if ( ret == -EAGAIN )
         {
+            int rc;
+
             argo_dprintk("argo_ringbuf_sendv failed, EAGAIN\n");
             /* requeue to issue a notification when space is there */
-            ret = pending_requeue(dst_d, ring_info, src_id.domain_id, len);
+            rc = pending_requeue(dst_d, ring_info, src_id.domain_id, len);
+            if ( rc )
+                ret = rc;
         }
 
         spin_unlock(&ring_info->L3_lock);