Commit bf224871 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branches 'pm-sleep', 'powercap' and 'pm-tools'

Merge updates related to system sleep handling, one power capping update
and one PM utility update for 6.7-rc1:

 - Use __get_safe_page() rather than touching the list in hibernation
   snapshot code (Brian Geffon).

 - Fix symbol export for _SIMPLE_ variants of _PM_OPS() (Raag Jadav).

 - Clean up sync_read handling in snapshot_write_next() (Brian Geffon).

 - Fix kerneldoc comments for swsusp_check() and swsusp_close() to
   better match code (Christoph Hellwig).

 - Downgrade BIOS locked limits pr_warn() in the Intel RAPL power
   capping driver to pr_debug() (Ville Syrjälä).

 - Change the minimum python version for the intel_pstate_tracer utility
   from 2.7 to 3.6 (Doug Smythies).

* pm-sleep:
  PM: hibernate: fix the kerneldoc comment for swsusp_check() and swsusp_close()
  PM: hibernate: Clean up sync_read handling in snapshot_write_next()
  PM: sleep: Fix symbol export for _SIMPLE_ variants of _PM_OPS()
  PM: hibernate: Use __get_safe_page() rather than touching the list

* powercap:
  powercap: intel_rapl: Downgrade BIOS locked limits pr_warn() to pr_debug()

* pm-tools:
  tools/power/x86/intel_pstate_tracer: python minimum version
...@@ -892,7 +892,7 @@ static int rapl_write_pl_data(struct rapl_domain *rd, int pl, ...@@ -892,7 +892,7 @@ static int rapl_write_pl_data(struct rapl_domain *rd, int pl,
return -EINVAL; return -EINVAL;
if (rd->rpl[pl].locked) { if (rd->rpl[pl].locked) {
pr_warn("%s:%s:%s locked by BIOS\n", rd->rp->name, rd->name, pl_names[pl]); pr_debug("%s:%s:%s locked by BIOS\n", rd->rp->name, rd->name, pl_names[pl]);
return -EACCES; return -EACCES;
} }
......
...@@ -374,25 +374,40 @@ const struct dev_pm_ops name = { \ ...@@ -374,25 +374,40 @@ const struct dev_pm_ops name = { \
RUNTIME_PM_OPS(runtime_suspend_fn, runtime_resume_fn, idle_fn) \ RUNTIME_PM_OPS(runtime_suspend_fn, runtime_resume_fn, idle_fn) \
} }
#ifdef CONFIG_PM #define _EXPORT_PM_OPS(name, license, ns) \
#define _EXPORT_DEV_PM_OPS(name, license, ns) \
const struct dev_pm_ops name; \ const struct dev_pm_ops name; \
__EXPORT_SYMBOL(name, license, ns); \ __EXPORT_SYMBOL(name, license, ns); \
const struct dev_pm_ops name const struct dev_pm_ops name
#define _DISCARD_PM_OPS(name, license, ns) \
static __maybe_unused const struct dev_pm_ops __static_##name
#ifdef CONFIG_PM
#define _EXPORT_DEV_PM_OPS(name, license, ns) _EXPORT_PM_OPS(name, license, ns)
#define EXPORT_PM_FN_GPL(name) EXPORT_SYMBOL_GPL(name) #define EXPORT_PM_FN_GPL(name) EXPORT_SYMBOL_GPL(name)
#define EXPORT_PM_FN_NS_GPL(name, ns) EXPORT_SYMBOL_NS_GPL(name, ns) #define EXPORT_PM_FN_NS_GPL(name, ns) EXPORT_SYMBOL_NS_GPL(name, ns)
#else #else
#define _EXPORT_DEV_PM_OPS(name, license, ns) \ #define _EXPORT_DEV_PM_OPS(name, license, ns) _DISCARD_PM_OPS(name, license, ns)
static __maybe_unused const struct dev_pm_ops __static_##name
#define EXPORT_PM_FN_GPL(name) #define EXPORT_PM_FN_GPL(name)
#define EXPORT_PM_FN_NS_GPL(name, ns) #define EXPORT_PM_FN_NS_GPL(name, ns)
#endif #endif
#ifdef CONFIG_PM_SLEEP
#define _EXPORT_DEV_SLEEP_PM_OPS(name, license, ns) _EXPORT_PM_OPS(name, license, ns)
#else
#define _EXPORT_DEV_SLEEP_PM_OPS(name, license, ns) _DISCARD_PM_OPS(name, license, ns)
#endif
#define EXPORT_DEV_PM_OPS(name) _EXPORT_DEV_PM_OPS(name, "", "") #define EXPORT_DEV_PM_OPS(name) _EXPORT_DEV_PM_OPS(name, "", "")
#define EXPORT_GPL_DEV_PM_OPS(name) _EXPORT_DEV_PM_OPS(name, "GPL", "") #define EXPORT_GPL_DEV_PM_OPS(name) _EXPORT_DEV_PM_OPS(name, "GPL", "")
#define EXPORT_NS_DEV_PM_OPS(name, ns) _EXPORT_DEV_PM_OPS(name, "", #ns) #define EXPORT_NS_DEV_PM_OPS(name, ns) _EXPORT_DEV_PM_OPS(name, "", #ns)
#define EXPORT_NS_GPL_DEV_PM_OPS(name, ns) _EXPORT_DEV_PM_OPS(name, "GPL", #ns) #define EXPORT_NS_GPL_DEV_PM_OPS(name, ns) _EXPORT_DEV_PM_OPS(name, "GPL", #ns)
#define EXPORT_DEV_SLEEP_PM_OPS(name) _EXPORT_DEV_SLEEP_PM_OPS(name, "", "")
#define EXPORT_GPL_DEV_SLEEP_PM_OPS(name) _EXPORT_DEV_SLEEP_PM_OPS(name, "GPL", "")
#define EXPORT_NS_DEV_SLEEP_PM_OPS(name, ns) _EXPORT_DEV_SLEEP_PM_OPS(name, "", #ns)
#define EXPORT_NS_GPL_DEV_SLEEP_PM_OPS(name, ns) _EXPORT_DEV_SLEEP_PM_OPS(name, "GPL", #ns)
/* /*
* Use this if you want to use the same suspend and resume callbacks for suspend * Use this if you want to use the same suspend and resume callbacks for suspend
* to RAM and hibernation. * to RAM and hibernation.
...@@ -404,19 +419,19 @@ const struct dev_pm_ops name = { \ ...@@ -404,19 +419,19 @@ const struct dev_pm_ops name = { \
_DEFINE_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL) _DEFINE_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL)
#define EXPORT_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ #define EXPORT_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \
EXPORT_DEV_PM_OPS(name) = { \ EXPORT_DEV_SLEEP_PM_OPS(name) = { \
SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
} }
#define EXPORT_GPL_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \ #define EXPORT_GPL_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \
EXPORT_GPL_DEV_PM_OPS(name) = { \ EXPORT_GPL_DEV_SLEEP_PM_OPS(name) = { \
SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
} }
#define EXPORT_NS_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn, ns) \ #define EXPORT_NS_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn, ns) \
EXPORT_NS_DEV_PM_OPS(name, ns) = { \ EXPORT_NS_DEV_SLEEP_PM_OPS(name, ns) = { \
SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
} }
#define EXPORT_NS_GPL_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn, ns) \ #define EXPORT_NS_GPL_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn, ns) \
EXPORT_NS_GPL_DEV_PM_OPS(name, ns) = { \ EXPORT_NS_GPL_DEV_SLEEP_PM_OPS(name, ns) = { \
SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \ SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
} }
......
...@@ -2545,8 +2545,9 @@ static void *get_highmem_page_buffer(struct page *page, ...@@ -2545,8 +2545,9 @@ static void *get_highmem_page_buffer(struct page *page,
pbe->copy_page = tmp; pbe->copy_page = tmp;
} else { } else {
/* Copy of the page will be stored in normal memory */ /* Copy of the page will be stored in normal memory */
kaddr = safe_pages_list; kaddr = __get_safe_page(ca->gfp_mask);
safe_pages_list = safe_pages_list->next; if (!kaddr)
return ERR_PTR(-ENOMEM);
pbe->copy_page = virt_to_page(kaddr); pbe->copy_page = virt_to_page(kaddr);
} }
pbe->next = highmem_pblist; pbe->next = highmem_pblist;
...@@ -2750,8 +2751,9 @@ static void *get_buffer(struct memory_bitmap *bm, struct chain_allocator *ca) ...@@ -2750,8 +2751,9 @@ static void *get_buffer(struct memory_bitmap *bm, struct chain_allocator *ca)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
} }
pbe->orig_address = page_address(page); pbe->orig_address = page_address(page);
pbe->address = safe_pages_list; pbe->address = __get_safe_page(ca->gfp_mask);
safe_pages_list = safe_pages_list->next; if (!pbe->address)
return ERR_PTR(-ENOMEM);
pbe->next = restore_pblist; pbe->next = restore_pblist;
restore_pblist = pbe; restore_pblist = pbe;
return pbe->address; return pbe->address;
...@@ -2783,8 +2785,6 @@ int snapshot_write_next(struct snapshot_handle *handle) ...@@ -2783,8 +2785,6 @@ int snapshot_write_next(struct snapshot_handle *handle)
if (handle->cur > 1 && handle->cur > nr_meta_pages + nr_copy_pages + nr_zero_pages) if (handle->cur > 1 && handle->cur > nr_meta_pages + nr_copy_pages + nr_zero_pages)
return 0; return 0;
handle->sync_read = 1;
if (!handle->cur) { if (!handle->cur) {
if (!buffer) if (!buffer)
/* This makes the buffer be freed by swsusp_free() */ /* This makes the buffer be freed by swsusp_free() */
...@@ -2827,7 +2827,6 @@ int snapshot_write_next(struct snapshot_handle *handle) ...@@ -2827,7 +2827,6 @@ int snapshot_write_next(struct snapshot_handle *handle)
memory_bm_position_reset(&zero_bm); memory_bm_position_reset(&zero_bm);
restore_pblist = NULL; restore_pblist = NULL;
handle->buffer = get_buffer(&orig_bm, &ca); handle->buffer = get_buffer(&orig_bm, &ca);
handle->sync_read = 0;
if (IS_ERR(handle->buffer)) if (IS_ERR(handle->buffer))
return PTR_ERR(handle->buffer); return PTR_ERR(handle->buffer);
} }
...@@ -2837,9 +2836,8 @@ int snapshot_write_next(struct snapshot_handle *handle) ...@@ -2837,9 +2836,8 @@ int snapshot_write_next(struct snapshot_handle *handle)
handle->buffer = get_buffer(&orig_bm, &ca); handle->buffer = get_buffer(&orig_bm, &ca);
if (IS_ERR(handle->buffer)) if (IS_ERR(handle->buffer))
return PTR_ERR(handle->buffer); return PTR_ERR(handle->buffer);
if (handle->buffer != buffer)
handle->sync_read = 0;
} }
handle->sync_read = (handle->buffer == buffer);
handle->cur++; handle->cur++;
/* Zero pages were not included in the image, memset it and move on. */ /* Zero pages were not included in the image, memset it and move on. */
......
...@@ -1513,7 +1513,7 @@ int swsusp_read(unsigned int *flags_p) ...@@ -1513,7 +1513,7 @@ int swsusp_read(unsigned int *flags_p)
static void *swsusp_holder; static void *swsusp_holder;
/** /**
* swsusp_check - Check for swsusp signature in the resume device * swsusp_check - Open the resume device and check for the swsusp signature.
* @exclusive: Open the resume device exclusively. * @exclusive: Open the resume device exclusively.
*/ */
...@@ -1564,7 +1564,7 @@ int swsusp_check(bool exclusive) ...@@ -1564,7 +1564,7 @@ int swsusp_check(bool exclusive)
} }
/** /**
* swsusp_close - close swap device. * swsusp_close - close resume device.
* @exclusive: Close the resume device which is exclusively opened. * @exclusive: Close the resume device which is exclusively opened.
*/ */
......
#!/usr/bin/env python #!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
...@@ -11,11 +11,11 @@ then this utility enables and collects trace data for a user specified interval ...@@ -11,11 +11,11 @@ then this utility enables and collects trace data for a user specified interval
and generates performance plots. and generates performance plots.
Prerequisites: Prerequisites:
Python version 2.7.x or higher Python version 3.6.x or higher
gnuplot 5.0 or higher gnuplot 5.0 or higher
gnuplot-py 1.8 or higher python3-gnuplot 1.8 or higher
(Most of the distributions have these required packages. They may be called (Most of the distributions have these required packages. They may be called
gnuplot-py, phython-gnuplot or phython3-gnuplot, gnuplot-nox, ... ) gnuplot-py, python-gnuplot or python3-gnuplot, gnuplot-nox, ... )
HWP (Hardware P-States are disabled) HWP (Hardware P-States are disabled)
Kernel config for Linux trace is enabled Kernel config for Linux trace is enabled
...@@ -23,7 +23,7 @@ Prerequisites: ...@@ -23,7 +23,7 @@ Prerequisites:
see print_help(): for Usage and Output details see print_help(): for Usage and Output details
""" """
from __future__ import print_function
from datetime import datetime from datetime import datetime
import subprocess import subprocess
import os import os
...@@ -562,7 +562,7 @@ if __name__ == "__main__": ...@@ -562,7 +562,7 @@ if __name__ == "__main__":
# Temporary (or perhaps not) # Temporary (or perhaps not)
cur_version = sys.version_info cur_version = sys.version_info
print('python version (should be >= 2.7):') print('python version (should be >= 3.6):')
print(cur_version) print(cur_version)
# Left as "cleanup" for potential future re-run ability. # Left as "cleanup" for potential future re-run ability.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment