From f20ac07dded0702b078449a885ed428c70501dff Mon Sep 17 00:00:00 2001 From: Hristo Belchev Date: Mon, 12 Feb 2024 11:54:33 +0000 Subject: [PATCH 1/2] mem: Fix assertions in LRG Q policy Fix assertions in LRG Queue Policy to correctly assert requestor and list validity Change-Id: I84e3f5b8936b74e7ac675faf7a3e6b9999026781 --- src/mem/qos/q_policy.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mem/qos/q_policy.cc b/src/mem/qos/q_policy.cc index a6d13feb7e..9550eb47c6 100644 --- a/src/mem/qos/q_policy.cc +++ b/src/mem/qos/q_policy.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 ARM Limited + * Copyright (c) 2018,2024 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -91,10 +91,10 @@ LrgQueuePolicy::selectPacket(PacketQueue* q) "from queue with id %d\n", requestor_id); // Check if this is a known requestor. - panic_if(memCtrl->hasRequestor(requestor_id), + panic_if(!memCtrl->hasRequestor(requestor_id), "%s: Unrecognized Requestor\n", __func__); - panic_if(toServe.size() > 0, + panic_if(toServe.size() <= 0, "%s: toServe list is empty\n", __func__); if (toServe.front() == requestor_id) { From 2138a4ec92c59dd72d9e7a93a6ab17d5eb63236b Mon Sep 17 00:00:00 2001 From: Hristo Belchev Date: Mon, 12 Feb 2024 15:04:58 +0000 Subject: [PATCH 2/2] mem: Fix LIFO q_policy and add assetions * Fix selectPacket() in LIFO Queue Policy to correctly return the end of the `deque` backing store for its packet queue * Move selectPacket() implementations for FIFO and LIFO queues into `q_policy.cc` file Change-Id: I8c35e5fc83dc380b19f52be14c18b1f414f9e141 --- src/mem/qos/q_policy.cc | 21 +++++++++++++++++++-- src/mem/qos/q_policy.hh | 20 +++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/mem/qos/q_policy.cc b/src/mem/qos/q_policy.cc index 9550eb47c6..0a210f3c71 100644 --- a/src/mem/qos/q_policy.cc +++ b/src/mem/qos/q_policy.cc @@ -69,9 +69,27 @@ QueuePolicy::create(const QoSMemCtrlParams &p) } } +QueuePolicy::PacketQueue::iterator +FifoQueuePolicy::selectPacket(PacketQueue* queue) +{ + panic_if(queue->empty(), + "Provided packet queue is not usable by queue policy"); + return queue->begin(); +} + +QueuePolicy::PacketQueue::iterator +LifoQueuePolicy::selectPacket(PacketQueue* queue) +{ + panic_if(queue->empty(), + "Provided packet queue is not usable by queue policy"); + return std::prev(queue->end()); +} + QueuePolicy::PacketQueue::iterator LrgQueuePolicy::selectPacket(PacketQueue* q) { + panic_if(q->empty(), + "Provided packet queue is not usable by queue policy"); QueuePolicy::PacketQueue::iterator ret = q->end(); // Tracks one packet per requestor in the queue @@ -137,8 +155,7 @@ LrgQueuePolicy::selectPacket(PacketQueue* q) DPRINTF(QOS, "QoSQPolicy::lrg no packet was serviced\n"); - // Ret will be : packet to serve if any found or queue begin - // (end if queue is empty) + // Ret will be : packet to serve return ret; } diff --git a/src/mem/qos/q_policy.hh b/src/mem/qos/q_policy.hh index fc9200d0af..39fd2d9bb4 100644 --- a/src/mem/qos/q_policy.hh +++ b/src/mem/qos/q_policy.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 ARM Limited + * Copyright (c) 2018, 2024 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -93,7 +93,7 @@ class QueuePolicy * The implementation of this virtual method selects the packet * to be serviced from the packet queue passed as an argument. * - * @param queue Packet queue + * @param queue Non-empty packet queue to select a packet from * @return Iterator pointing to the packet in the queue to be * serviced */ @@ -127,14 +127,11 @@ class LifoQueuePolicy : public QueuePolicy /** * Implements LIFO packet select policy * - * @param queue The queue in which to select a packet + * @param queue The non-empty queue from which to select a packet * @return Iterator to the selected packet */ PacketQueue::iterator - selectPacket(PacketQueue* queue) override - { - return queue->end(); - } + selectPacket(PacketQueue* queue) override; }; /** First In First Out Queue Policy */ @@ -148,14 +145,11 @@ class FifoQueuePolicy : public QueuePolicy /** * Implements FCFS packet select policy * - * @param queue The queue in which to select a packet + * @param queue The non-empty queue from which to select a packet * @return Iterator to the selected packet */ PacketQueue::iterator - selectPacket(PacketQueue* queue) override - { - return queue->begin(); - } + selectPacket(PacketQueue* queue) override; }; /** @@ -176,7 +170,7 @@ class LrgQueuePolicy : public QueuePolicy /** * Implements LRG packet select policy * - * @param queue The queue in which to select a packet + * @param queue The non-empty queue from which to select a packet * @return Iterator to the selected packet */ PacketQueue::iterator