113023Sgiacomo.travaglini@arm.com/* 213023Sgiacomo.travaglini@arm.com * Copyright (c) 2018 ARM Limited 313023Sgiacomo.travaglini@arm.com * All rights reserved 413023Sgiacomo.travaglini@arm.com * 513023Sgiacomo.travaglini@arm.com * The license below extends only to copyright in the software and shall 613023Sgiacomo.travaglini@arm.com * not be construed as granting a license to any other intellectual 713023Sgiacomo.travaglini@arm.com * property including but not limited to intellectual property relating 813023Sgiacomo.travaglini@arm.com * to a hardware implementation of the functionality of the software 913023Sgiacomo.travaglini@arm.com * licensed hereunder. You may use the software subject to the license 1013023Sgiacomo.travaglini@arm.com * terms below provided that you ensure that this notice is replicated 1113023Sgiacomo.travaglini@arm.com * unmodified and in its entirety in all distributions of the software, 1213023Sgiacomo.travaglini@arm.com * modified or unmodified, in source code or in binary form. 1313023Sgiacomo.travaglini@arm.com * 1413023Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without 1513023Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are 1613023Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright 1713023Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer; 1813023Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright 1913023Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the 2013023Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution; 2113023Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its 2213023Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from 2313023Sgiacomo.travaglini@arm.com * this software without specific prior written permission. 2413023Sgiacomo.travaglini@arm.com * 2513023Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2613023Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2713023Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2813023Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2913023Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3013023Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3113023Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3213023Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3313023Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3413023Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3513023Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3613023Sgiacomo.travaglini@arm.com * 3713023Sgiacomo.travaglini@arm.com * Author: Giacomo Travaglini 3813023Sgiacomo.travaglini@arm.com */ 3913023Sgiacomo.travaglini@arm.com 4013023Sgiacomo.travaglini@arm.com#include "mem/qos/policy_pf.hh" 4113023Sgiacomo.travaglini@arm.com 4213023Sgiacomo.travaglini@arm.com#include "mem/request.hh" 4313023Sgiacomo.travaglini@arm.com 4413023Sgiacomo.travaglini@arm.comnamespace QoS { 4513023Sgiacomo.travaglini@arm.com 4613023Sgiacomo.travaglini@arm.comPropFairPolicy::PropFairPolicy(const Params* p) 4713023Sgiacomo.travaglini@arm.com : Policy(p), weight(p->weight) 4813023Sgiacomo.travaglini@arm.com{ 4913023Sgiacomo.travaglini@arm.com fatal_if(weight < 0 || weight > 1, 5013023Sgiacomo.travaglini@arm.com "weight must be a value between 0 and 1"); 5113023Sgiacomo.travaglini@arm.com} 5213023Sgiacomo.travaglini@arm.com 5313023Sgiacomo.travaglini@arm.comPropFairPolicy::~PropFairPolicy() 5413023Sgiacomo.travaglini@arm.com{} 5513023Sgiacomo.travaglini@arm.com 5613023Sgiacomo.travaglini@arm.comtemplate <typename Master> 5713023Sgiacomo.travaglini@arm.comvoid 5813023Sgiacomo.travaglini@arm.comPropFairPolicy::initMaster(const Master master, const double score) 5913023Sgiacomo.travaglini@arm.com{ 6013023Sgiacomo.travaglini@arm.com MasterID m_id = memCtrl->system()->lookupMasterId(master); 6113023Sgiacomo.travaglini@arm.com 6213023Sgiacomo.travaglini@arm.com assert(m_id != Request::invldMasterId); 6313023Sgiacomo.travaglini@arm.com 6413023Sgiacomo.travaglini@arm.com // Setting the Initial score for the selected master. 6513023Sgiacomo.travaglini@arm.com history.push_back(std::make_pair(m_id, score)); 6613023Sgiacomo.travaglini@arm.com 6713023Sgiacomo.travaglini@arm.com fatal_if(history.size() > memCtrl->numPriorities(), 6813023Sgiacomo.travaglini@arm.com "Policy's maximum number of masters is currently dictated " 6913023Sgiacomo.travaglini@arm.com "by the maximum number of priorities\n"); 7013023Sgiacomo.travaglini@arm.com} 7113023Sgiacomo.travaglini@arm.com 7213023Sgiacomo.travaglini@arm.comvoid 7313023Sgiacomo.travaglini@arm.comPropFairPolicy::initMasterName(const std::string master, const double score) 7413023Sgiacomo.travaglini@arm.com{ 7513023Sgiacomo.travaglini@arm.com initMaster(master, score); 7613023Sgiacomo.travaglini@arm.com} 7713023Sgiacomo.travaglini@arm.com 7813023Sgiacomo.travaglini@arm.comvoid 7913023Sgiacomo.travaglini@arm.comPropFairPolicy::initMasterObj(const SimObject* master, const double score) 8013023Sgiacomo.travaglini@arm.com{ 8113023Sgiacomo.travaglini@arm.com initMaster(master, score); 8213023Sgiacomo.travaglini@arm.com} 8313023Sgiacomo.travaglini@arm.com 8413023Sgiacomo.travaglini@arm.comdouble 8513023Sgiacomo.travaglini@arm.comPropFairPolicy::updateScore( 8613023Sgiacomo.travaglini@arm.com const double old_score, const uint64_t served_bytes) const 8713023Sgiacomo.travaglini@arm.com{ 8813023Sgiacomo.travaglini@arm.com return ((1.0 - weight) * old_score) + (weight * served_bytes); 8913023Sgiacomo.travaglini@arm.com} 9013023Sgiacomo.travaglini@arm.com 9113023Sgiacomo.travaglini@arm.comuint8_t 9213023Sgiacomo.travaglini@arm.comPropFairPolicy::schedule(const MasterID pkt_mid, const uint64_t pkt_size) 9313023Sgiacomo.travaglini@arm.com{ 9413023Sgiacomo.travaglini@arm.com auto sort_pred = 9513023Sgiacomo.travaglini@arm.com [] (const MasterHistory& lhs, const MasterHistory& rhs) 9613023Sgiacomo.travaglini@arm.com { return lhs.second > rhs.second; }; 9713023Sgiacomo.travaglini@arm.com 9813023Sgiacomo.travaglini@arm.com // Sorting in reverse in base of personal history: 9913023Sgiacomo.travaglini@arm.com // First elements have higher history/score -> lower priority. 10013023Sgiacomo.travaglini@arm.com // The qos priority is the position in the sorted vector. 10113023Sgiacomo.travaglini@arm.com std::sort(history.begin(), history.end(), sort_pred); 10213023Sgiacomo.travaglini@arm.com 10313023Sgiacomo.travaglini@arm.com const double served_bytes = static_cast<double>(pkt_size); 10413023Sgiacomo.travaglini@arm.com 10513023Sgiacomo.travaglini@arm.com uint8_t pkt_priority = 0; 10613023Sgiacomo.travaglini@arm.com for (auto m_hist = history.begin(); m_hist != history.end(); m_hist++) { 10713023Sgiacomo.travaglini@arm.com 10813023Sgiacomo.travaglini@arm.com MasterID curr_mid = m_hist->first; 10913023Sgiacomo.travaglini@arm.com double& curr_score = m_hist->second; 11013023Sgiacomo.travaglini@arm.com 11113023Sgiacomo.travaglini@arm.com if (curr_mid == pkt_mid) { 11213023Sgiacomo.travaglini@arm.com // The qos priority is the position in the sorted vector. 11313023Sgiacomo.travaglini@arm.com pkt_priority = std::distance(history.begin(), m_hist); 11413023Sgiacomo.travaglini@arm.com 11513023Sgiacomo.travaglini@arm.com curr_score = updateScore(curr_score, served_bytes); 11613023Sgiacomo.travaglini@arm.com } else { 11713023Sgiacomo.travaglini@arm.com curr_score = updateScore(curr_score, 0); 11813023Sgiacomo.travaglini@arm.com } 11913023Sgiacomo.travaglini@arm.com } 12013023Sgiacomo.travaglini@arm.com 12113023Sgiacomo.travaglini@arm.com return pkt_priority; 12213023Sgiacomo.travaglini@arm.com} 12313023Sgiacomo.travaglini@arm.com 12413023Sgiacomo.travaglini@arm.com} // namespace QoS 12513023Sgiacomo.travaglini@arm.com 12613023Sgiacomo.travaglini@arm.comQoS::PropFairPolicy * 12713023Sgiacomo.travaglini@arm.comQoSPropFairPolicyParams::create() 12813023Sgiacomo.travaglini@arm.com{ 12913023Sgiacomo.travaglini@arm.com return new QoS::PropFairPolicy(this); 13013023Sgiacomo.travaglini@arm.com} 131