Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/thermal/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  gov_fair_share.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
/*
 *  fair_share.c - A simple weight based Thermal governor
 *
 *  Copyright (C) 2012 Intel Corp
 *  Copyright (C) 2012 Durgadoss R <durgadoss.r@intel.com>
 *
 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */


#include <linux/thermal.h>
#include "thermal_trace.h"

#include "thermal_core.h"

static int get_trip_level(struct thermal_zone_device *tz)
{
 const struct thermal_trip_desc *level_td = NULL;
 const struct thermal_trip_desc *td;
 int trip_level = -1;

 for_each_trip_desc(tz, td) {
  if (td->threshold > tz->temperature)
   continue;

  trip_level++;

  if (!level_td || td->threshold > level_td->threshold)
   level_td = td;
 }

 /*  Bail out if the temperature is not greater than any trips. */
 if (trip_level < 0)
  return 0;

 trace_thermal_zone_trip(tz, thermal_zone_trip_id(tz, &level_td->trip),
    level_td->trip.type);

 return trip_level;
}

/**
 * fair_share_throttle - throttles devices associated with the given zone
 * @tz: thermal_zone_device
 * @td: trip point descriptor
 * @trip_level: number of trips crossed by the zone temperature
 *
 * Throttling Logic: This uses three parameters to calculate the new
 * throttle state of the cooling devices associated with the given zone.
 *
 * Parameters used for Throttling:
 * P1. max_state: Maximum throttle state exposed by the cooling device.
 * P2. weight[i]/total_weight:
 * How 'effective' the 'i'th device is, in cooling the given zone.
 * P3. trip_level/max_no_of_trips:
 * This describes the extent to which the devices should be throttled.
 * We do not want to throttle too much when we trip a lower temperature,
 * whereas the throttling is at full swing if we trip critical levels.
 * new_state of cooling device = P3 * P2 * P1
 */

static void fair_share_throttle(struct thermal_zone_device *tz,
    const struct thermal_trip_desc *td,
    int trip_level)
{
 struct thermal_instance *instance;
 int total_weight = 0;
 int nr_instances = 0;

 list_for_each_entry(instance, &td->thermal_instances, trip_node) {
  total_weight += instance->weight;
  nr_instances++;
 }

 list_for_each_entry(instance, &td->thermal_instances, trip_node) {
  struct thermal_cooling_device *cdev = instance->cdev;
  u64 dividend;
  u32 divisor;

  dividend = trip_level;
  dividend *= cdev->max_state;
  divisor = tz->num_trips;
  if (total_weight) {
   dividend *= instance->weight;
   divisor *= total_weight;
  } else {
   divisor *= nr_instances;
  }
  instance->target = div_u64(dividend, divisor);

  thermal_cdev_update_nocheck(cdev);
 }
}

static void fair_share_manage(struct thermal_zone_device *tz)
{
 int trip_level = get_trip_level(tz);
 const struct thermal_trip_desc *td;

 lockdep_assert_held(&tz->lock);

 for_each_trip_desc(tz, td) {
  const struct thermal_trip *trip = &td->trip;

  if (trip->temperature == THERMAL_TEMP_INVALID ||
      trip->type == THERMAL_TRIP_CRITICAL ||
      trip->type == THERMAL_TRIP_HOT)
   continue;

  fair_share_throttle(tz, td, trip_level);
 }
}

static struct thermal_governor thermal_gov_fair_share = {
 .name = "fair_share",
 .manage = fair_share_manage,
};
THERMAL_GOVERNOR_DECLARE(thermal_gov_fair_share);

Messung V0.5
C=96 H=93 G=94

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.