return -ENOMEM;
        smu_power->power_context_size = sizeof(struct smu_11_0_dpm_context);
 
+       smu->metrics_time = 0;
+       smu->metrics_table = kzalloc(sizeof(SmuMetrics_t), GFP_KERNEL);
+       if (!smu->metrics_table) {
+               kfree(smu_power->power_context);
+               return -ENOMEM;
+       }
+
        return 0;
 }
 
        if (!smu_power->power_context || smu_power->power_context_size == 0)
                return -EINVAL;
 
+       kfree(smu->metrics_table);
        kfree(smu_power->power_context);
+       smu->metrics_table = NULL;
        smu_power->power_context = NULL;
        smu_power->power_context_size = 0;
 
        return ret;
 }
 
+static int smu_v11_0_get_metrics_table(struct smu_context *smu,
+               SmuMetrics_t *metrics_table)
+{
+       int ret = 0;
+
+       if (!smu->metrics_time || time_after(jiffies, smu->metrics_time + HZ / 1000)) {
+               ret = smu_update_table(smu, TABLE_SMU_METRICS,
+                               (void *)metrics_table, false);
+               if (ret) {
+                       pr_info("Failed to export SMU metrics table!\n");
+                       return ret;
+               }
+               memcpy(smu->metrics_table, metrics_table, sizeof(SmuMetrics_t));
+               smu->metrics_time = jiffies;
+       } else
+               memcpy(metrics_table, smu->metrics_table, sizeof(SmuMetrics_t));
+
+       return ret;
+}
+
 static int smu_v11_0_get_current_activity_percent(struct smu_context *smu,
                                                  uint32_t *value)
 {
        if (!value)
                return -EINVAL;
 
-       ret = smu_update_table(smu, TABLE_SMU_METRICS, (void *)&metrics, false);
+       ret = smu_v11_0_get_metrics_table(smu, &metrics);
        if (ret)
                return ret;
 
        if (!value)
                return -EINVAL;
 
-       ret = smu_update_table(smu, TABLE_SMU_METRICS, (void *)&metrics, false);
+       ret = smu_v11_0_get_metrics_table(smu, &metrics);
        if (ret)
                return ret;