[util] Use magma_read_notification_channel2 for inflightlist

Skip calling if more data not available.

Change-Id: I06211d6bab321b3207f5748f79d9eb103caa86ce
Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/mesa/+/464317
Reviewed-by: John Bauman <jbauman@google.com>
diff --git a/src/util/inflight_list.c b/src/util/inflight_list.c
index bab3933..ed3d75e 100644
--- a/src/util/inflight_list.c
+++ b/src/util/inflight_list.c
@@ -61,7 +61,7 @@
    }
 
    list->wait_ = wait_notification_channel;
-   list->read_ = magma_read_notification_channel;
+   list->read_ = magma_read_notification_channel2;
    u_vector_init(&list->buffers_, sizeof(uint64_t), sizeof(uint64_t) * 8 /* initial byte size */);
    list->size_ = 0;
    return list;
@@ -188,9 +188,11 @@
 void InflightList_update(struct InflightList* list, magma_connection_t connection)
 {
    uint64_t bytes_available = 0;
+   magma_bool_t more_data = false;
    while (true) {
       magma_status_t status =
-          list->read_(connection, list->notification_buffer, sizeof(list->notification_buffer), &bytes_available);
+          list->read_(connection, list->notification_buffer, sizeof(list->notification_buffer),
+                      &bytes_available, &more_data);
       if (status != MAGMA_STATUS_OK) {
          return;
       }
@@ -201,5 +203,7 @@
          assert(InflightList_is_inflight(list, list->notification_buffer[i]));
          InflightList_remove(list, list->notification_buffer[i]);
       }
+      if (!more_data)
+         return;
    }
 }
diff --git a/src/util/inflight_list.h b/src/util/inflight_list.h
index 980d4ac..7ac68ff 100644
--- a/src/util/inflight_list.h
+++ b/src/util/inflight_list.h
@@ -41,7 +41,8 @@
 
 typedef magma_status_t (*read_notification_channel_t)(magma_connection_t connection, void* buffer,
                                                       uint64_t buffer_size,
-                                                      uint64_t* buffer_size_out);
+                                                      uint64_t* buffer_size_out,
+                                                      magma_bool_t* more_data_out);
 
 struct InflightList {
    wait_notification_channel_t wait_;
diff --git a/src/util/tests/inflight_list/test_inflight_list.cpp b/src/util/tests/inflight_list/test_inflight_list.cpp
index 66258dd..1b4ad54 100644
--- a/src/util/tests/inflight_list/test_inflight_list.cpp
+++ b/src/util/tests/inflight_list/test_inflight_list.cpp
@@ -62,7 +62,8 @@
 }
 
 static magma_status_t read_notification_channel(magma_connection_t connection, void* buffer,
-                                                uint64_t buffer_size, uint64_t* buffer_size_out)
+                                                uint64_t buffer_size, uint64_t* buffer_size_out,
+                                                magma_bool_t* more_data_out)
 {
    uint32_t buffer_actual_size;
    zx_status_t status = static_cast<TestConnection*>(connection)
@@ -70,6 +71,10 @@
                             .read(0, buffer, nullptr, buffer_size, 0, &buffer_actual_size, nullptr);
    if (status == ZX_OK) {
       *buffer_size_out = buffer_actual_size;
+      status = static_cast<TestConnection*>(connection)
+                   ->channel[0]
+                   .read(0, buffer, nullptr, 0, 0, &buffer_actual_size, nullptr);
+      *more_data_out = status == ZX_ERR_BUFFER_TOO_SMALL;
       return MAGMA_STATUS_OK;
    }
    return MAGMA_STATUS_INTERNAL_ERROR;
@@ -173,15 +178,18 @@
    std::vector<magma_system_exec_resource> resource;
    resource.push_back({.buffer_id = buffer_id});
    resource.push_back({.buffer_id = buffer_id + 1});
+   resource.push_back({.buffer_id = buffer_id + 2});
 
    InflightList_AddAndUpdate(list_, &connection, resource.data(), resource.size());
    EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id));
    EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 1));
+   EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 2));
 
    EXPECT_EQ(MAGMA_STATUS_TIMED_OUT,
              InflightList_WaitForBuffer(list_, &connection, buffer_id, 0 /*timeout_ns*/));
    EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id));
    EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 1));
+   EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 2));
 
    uint64_t value = buffer_id;
    connection.channel[1].write(0, &value, sizeof(value), nullptr, 0);
@@ -194,15 +202,19 @@
 
    EXPECT_FALSE(InflightList_is_inflight(list_, buffer_id));
    EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 1));
+   EXPECT_TRUE(InflightList_is_inflight(list_, buffer_id + 2));
 
    EXPECT_EQ(MAGMA_STATUS_OK, InflightList_WaitForBuffer(list_, &connection, buffer_id, 0));
 
    value = buffer_id + 1;
    connection.channel[1].write(0, &value, sizeof(value), nullptr, 0);
+   value = buffer_id + 2;
+   connection.channel[1].write(0, &value, sizeof(value), nullptr, 0);
 
    EXPECT_EQ(MAGMA_STATUS_OK,
              InflightList_WaitForBuffer(list_, &connection, buffer_id + 1, 0 /*timeout_ns*/));
 
    EXPECT_FALSE(InflightList_is_inflight(list_, buffer_id));
    EXPECT_FALSE(InflightList_is_inflight(list_, buffer_id + 1));
+   EXPECT_FALSE(InflightList_is_inflight(list_, buffer_id + 2));
 }