Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a02040d8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull pstore fixes from Kees Cook:
 "Fixes for pstore ramoops driver to catch bad kfree() and to use better
  DT bindings"

* tag 'pstore-v4.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  ramoops: use persistent_ram_free() instead of kfree() for freeing prz
  ramoops: use DT reserved-memory bindings
parents 0603006b e976e564
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -2,8 +2,9 @@ Ramoops oops/panic logger
=========================

ramoops provides persistent RAM storage for oops and panics, so they can be
recovered after a reboot. It is a backend to pstore, so this node is named
"ramoops" after the backend, rather than "pstore" which is the subsystem.
recovered after a reboot. This is a child-node of "/reserved-memory", and
is named "ramoops" after the backend, rather than "pstore" which is the
subsystem.

Parts of this storage may be set aside for other persistent log buffers, such
as kernel log messages, or for optional ECC error-correction data.  The total
@@ -21,8 +22,7 @@ Required properties:

- compatible: must be "ramoops"

- memory-region: phandle to a region of memory that is preserved between
  reboots
- reg: region of memory that is preserved between reboots


Optional properties:
+27 −11
Original line number Diff line number Diff line
@@ -45,18 +45,34 @@ corrupt, but usually it is restorable.

2. Setting the parameters

Setting the ramoops parameters can be done in 3 different manners:
 1. Use the module parameters (which have the names of the variables described
 as before).
 For quick debugging, you can also reserve parts of memory during boot
 and then use the reserved memory for ramoops. For example, assuming a machine
 with > 128 MB of memory, the following kernel command line will tell the
 kernel to use only the first 128 MB of memory, and place ECC-protected ramoops
 region at 128 MB boundary:
Setting the ramoops parameters can be done in several different manners:

 A. Use the module parameters (which have the names of the variables described
 as before). For quick debugging, you can also reserve parts of memory during
 boot and then use the reserved memory for ramoops. For example, assuming a
 machine with > 128 MB of memory, the following kernel command line will tell
 the kernel to use only the first 128 MB of memory, and place ECC-protected
 ramoops region at 128 MB boundary:
 "mem=128M ramoops.mem_address=0x8000000 ramoops.ecc=1"
 2. Use Device Tree bindings, as described in
 Documentation/device-tree/bindings/misc/ramoops.txt.
 3. Use a platform device and set the platform data. The parameters can then

 B. Use Device Tree bindings, as described in
 Documentation/device-tree/bindings/reserved-memory/ramoops.txt.
 For example:

	reserved-memory {
		#address-cells = <2>;
		#size-cells = <2>;
		ranges;

		ramoops@8f000000 {
			compatible = "ramoops";
			reg = <0 0x8f000000 0 0x100000>;
			record-size = <0x4000>;
			console-size = <0x4000>;
		};
	};

 C. Use a platform device and set the platform data. The parameters can then
 be set through that platform data. An example of doing that is:

#include <linux/pstore_ram.h>
+18 −2
Original line number Diff line number Diff line
@@ -499,7 +499,23 @@ EXPORT_SYMBOL_GPL(of_platform_default_populate);

static int __init of_platform_default_populate_init(void)
{
	if (of_have_populated_dt())
	struct device_node *node;

	if (!of_have_populated_dt())
		return -ENODEV;

	/*
	 * Handle ramoops explicitly, since it is inside /reserved-memory,
	 * which lacks a "compatible" property.
	 */
	node = of_find_node_by_path("/reserved-memory");
	if (node) {
		node = of_find_compatible_node(node, NULL, "ramoops");
		if (node)
			of_platform_device_create(node, NULL, NULL);
	}

	/* Populate everything else. */
	of_platform_default_populate(NULL, NULL, NULL);

	return 0;
+10 −19
Original line number Diff line number Diff line
@@ -486,30 +486,21 @@ static int ramoops_parse_dt(struct platform_device *pdev,
			    struct ramoops_platform_data *pdata)
{
	struct device_node *of_node = pdev->dev.of_node;
	struct device_node *mem_region;
	struct resource res;
	struct resource *res;
	u32 value;
	int ret;

	dev_dbg(&pdev->dev, "using Device Tree\n");

	mem_region = of_parse_phandle(of_node, "memory-region", 0);
	if (!mem_region) {
		dev_err(&pdev->dev, "no memory-region phandle\n");
		return -ENODEV;
	}

	ret = of_address_to_resource(mem_region, 0, &res);
	of_node_put(mem_region);
	if (ret) {
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(&pdev->dev,
			"failed to translate memory-region to resource: %d\n",
			ret);
		return ret;
			"failed to locate DT /reserved-memory resource\n");
		return -EINVAL;
	}

	pdata->mem_size = resource_size(&res);
	pdata->mem_address = res.start;
	pdata->mem_size = resource_size(res);
	pdata->mem_address = res->start;
	pdata->mem_type = of_property_read_bool(of_node, "unbuffered");
	pdata->dump_oops = !of_property_read_bool(of_node, "no-dump-oops");

@@ -652,11 +643,11 @@ static int ramoops_probe(struct platform_device *pdev)
	kfree(cxt->pstore.buf);
fail_clear:
	cxt->pstore.bufsize = 0;
	kfree(cxt->mprz);
	persistent_ram_free(cxt->mprz);
fail_init_mprz:
	kfree(cxt->fprz);
	persistent_ram_free(cxt->fprz);
fail_init_fprz:
	kfree(cxt->cprz);
	persistent_ram_free(cxt->cprz);
fail_init_cprz:
	ramoops_free_przs(cxt);
fail_out: