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#ifndef __MEM_QOS_POLICY_PF_HH__ 4113023Sgiacomo.travaglini@arm.com#define __MEM_QOS_POLICY_PF_HH__ 4213023Sgiacomo.travaglini@arm.com 4313023Sgiacomo.travaglini@arm.com#include "mem/qos/policy.hh" 4413023Sgiacomo.travaglini@arm.com#include "params/QoSPropFairPolicy.hh" 4513023Sgiacomo.travaglini@arm.com 4613023Sgiacomo.travaglini@arm.comnamespace QoS { 4713023Sgiacomo.travaglini@arm.com 4813023Sgiacomo.travaglini@arm.com/** 4913023Sgiacomo.travaglini@arm.com * Proportional Fair QoS Policy 5013023Sgiacomo.travaglini@arm.com * Providing a configurable fair scheduling policy based on 5113023Sgiacomo.travaglini@arm.com * utilization; utilization is directly proportional to a 5213023Sgiacomo.travaglini@arm.com * score which is inversely proportional to the QoS priority 5313023Sgiacomo.travaglini@arm.com * Users can tune the policy by adjusting the weight parameter 5413023Sgiacomo.travaglini@arm.com * (weight of the formula) 5513023Sgiacomo.travaglini@arm.com * 5613023Sgiacomo.travaglini@arm.com * This is the formula used by the policy 5713023Sgiacomo.travaglini@arm.com * ((1.0 - weight) * old_score) + (weight * served_bytes); 5813023Sgiacomo.travaglini@arm.com */ 5913023Sgiacomo.travaglini@arm.comclass PropFairPolicy : public Policy 6013023Sgiacomo.travaglini@arm.com{ 6113023Sgiacomo.travaglini@arm.com using Params = QoSPropFairPolicyParams; 6213023Sgiacomo.travaglini@arm.com const Params *params() const 6313023Sgiacomo.travaglini@arm.com { return static_cast<const Params *>(_params); } 6413023Sgiacomo.travaglini@arm.com 6513023Sgiacomo.travaglini@arm.com public: 6613023Sgiacomo.travaglini@arm.com PropFairPolicy(const Params*); 6713023Sgiacomo.travaglini@arm.com virtual ~PropFairPolicy(); 6813023Sgiacomo.travaglini@arm.com 6913023Sgiacomo.travaglini@arm.com /** 7013023Sgiacomo.travaglini@arm.com * Initialize the master's score by providing 7113023Sgiacomo.travaglini@arm.com * the master's name and initial score value. 7213023Sgiacomo.travaglini@arm.com * The master's name has to match a name in the system. 7313023Sgiacomo.travaglini@arm.com * 7413023Sgiacomo.travaglini@arm.com * @param master master's name to lookup. 7513023Sgiacomo.travaglini@arm.com * @param score initial score value for the master 7613023Sgiacomo.travaglini@arm.com */ 7713023Sgiacomo.travaglini@arm.com void initMasterName(const std::string master, const double score); 7813023Sgiacomo.travaglini@arm.com 7913023Sgiacomo.travaglini@arm.com /** 8013023Sgiacomo.travaglini@arm.com * Initialize the master's score by providing 8113023Sgiacomo.travaglini@arm.com * the master's SimObject pointer and initial score value. 8213023Sgiacomo.travaglini@arm.com * The master's pointer has to match a master in the system. 8313023Sgiacomo.travaglini@arm.com * 8413023Sgiacomo.travaglini@arm.com * @param master master's SimObject pointer to lookup. 8513023Sgiacomo.travaglini@arm.com * @param score initial score value for the master 8613023Sgiacomo.travaglini@arm.com */ 8713023Sgiacomo.travaglini@arm.com void initMasterObj(const SimObject* master, const double score); 8813023Sgiacomo.travaglini@arm.com 8913023Sgiacomo.travaglini@arm.com /** 9013023Sgiacomo.travaglini@arm.com * Schedules a packet based on proportional fair configuration 9113023Sgiacomo.travaglini@arm.com * 9213023Sgiacomo.travaglini@arm.com * @param m_id master id to schedule 9313023Sgiacomo.travaglini@arm.com * @param pkt_size size of the packet 9413023Sgiacomo.travaglini@arm.com * @return QoS priority value 9513023Sgiacomo.travaglini@arm.com */ 9613023Sgiacomo.travaglini@arm.com virtual uint8_t 9713023Sgiacomo.travaglini@arm.com schedule(const MasterID m_id, const uint64_t pkt_size) override; 9813023Sgiacomo.travaglini@arm.com 9913023Sgiacomo.travaglini@arm.com protected: 10013023Sgiacomo.travaglini@arm.com template <typename Master> 10113023Sgiacomo.travaglini@arm.com void initMaster(const Master master, const double score); 10213023Sgiacomo.travaglini@arm.com 10313023Sgiacomo.travaglini@arm.com inline double 10413023Sgiacomo.travaglini@arm.com updateScore(const double old_score, const uint64_t served_bytes) const; 10513023Sgiacomo.travaglini@arm.com 10613023Sgiacomo.travaglini@arm.com protected: 10713023Sgiacomo.travaglini@arm.com /** PF Policy weight */ 10813023Sgiacomo.travaglini@arm.com const double weight; 10913023Sgiacomo.travaglini@arm.com 11013023Sgiacomo.travaglini@arm.com /** history is keeping track of every master's score */ 11113023Sgiacomo.travaglini@arm.com using MasterHistory = std::pair<MasterID, double>; 11213023Sgiacomo.travaglini@arm.com std::vector<MasterHistory> history; 11313023Sgiacomo.travaglini@arm.com}; 11413023Sgiacomo.travaglini@arm.com 11513023Sgiacomo.travaglini@arm.com} // namespace QoS 11613023Sgiacomo.travaglini@arm.com 11713023Sgiacomo.travaglini@arm.com#endif // __MEM_QOS_POLICY_PF_HH__ 118