/// Remove .owner field if calls are used which set it automatically
///
// Confidence: High
// Copyright: (C) 2014 Wolfram Sang. GPL v2.
virtual patch
virtual context
virtual org
virtual report
@match1@
declarer name module_i2c_driver;
declarer name module_platform_driver;
declarer name module_platform_driver_probe;
identifier __driver;
@@
(
module_i2c_driver(__driver);
|
module_platform_driver(__driver);
|
module_platform_driver_probe(__driver, ...);
)
@fix1 depends on match1 && patch && !context && !org && !report@
identifier match1.__driver;
@@
static struct platform_driver __driver = {
.driver = {
- .owner = THIS_MODULE,
}
};
@fix1_i2c depends on match1 && patch && !context && !org && !report@
identifier match1.__driver;
@@
static struct i2c_driver __driver = {
.driver = {
- .owner = THIS_MODULE,
}
};
@match2@
identifier __driver;
@@
(
platform_driver_register(&__driver)
|
platform_driver_probe(&__driver, ...)
|
platform_create_bundle(&__driver, ...)
|
i2c_add_driver(&__driver)
)
@fix2 depends on match2 && patch && !context && !org && !report@
identifier match2.__driver;
@@
static struct platform_driver __driver = {
.driver = {
- .owner = THIS_MODULE,
}
};
@fix2_i2c depends on match2 && patch && !context && !org && !report@
identifier match2.__driver;
@@
static struct i2c_driver __driver = {
.driver = {
- .owner = THIS_MODULE,
}
};
// ----------------------------------------------------------------------------
@fix1_context depends on match1 && !patch && (context || org || report)@
identifier match1.__driver;
position j0;
@@
static struct platform_driver __driver = {
.driver = {
* .owner@j0 = THIS_MODULE,
}
};
@fix1_i2c_context depends on match1 && !patch && (context || org || report)@
identifier match1.__driver;
position j0;
@@
static struct i2c_driver __driver = {
.driver = {
* .owner@j0 = THIS_MODULE,
}
};
@fix2_context depends on match2 && !patch && (context || org || report)@
identifier match2.__driver;
position j0;
@@
static struct platform_driver __driver = {
.driver = {
* .owner@j0 = THIS_MODULE,
}
};
@fix2_i2c_context depends on match2 && !patch && (context || org || report)@
identifier match2.__driver;
position j0;
@@
static struct i2c_driver __driver = {
.driver = {
* .owner@j0 = THIS_MODULE,
}
};
// ----------------------------------------------------------------------------
@script:python fix1_org depends on org@
j0 << fix1_context.j0;
@@
msg = "No need to set .owner here. The core will do it."
coccilib.org.print_todo(j0[0], msg)
@script:python fix1_i2c_org depends on org@
j0 << fix1_i2c_context.j0;
@@
msg = "No need to set .owner here. The core will do it."
coccilib.org.print_todo(j0[0], msg)
@script:python fix2_org depends on org@
j0 << fix2_context.j0;
@@
msg = "No need to set .owner here. The core will do it."
coccilib.org.print_todo(j0[0], msg)
@script:python fix2_i2c_org depends on org@
j0 << fix2_i2c_context.j0;
@@
msg = "No need to set .owner here. The core will do it."
coccilib.org.print_todo(j0[0], msg)
// ----------------------------------------------------------------------------
@script:python fix1_report depends on report@
j0 << fix1_context.j0;
@@
msg = "No need to set .owner here. The core will do it."
coccilib.report.print_report(j0[0], msg)
@script:python fix1_i2c_report depends on report@
j0 << fix1_i2c_context.j0;
@@
msg = "No need to set .owner here. The core will do it."
coccilib.report.print_report(j0[0], msg)
@script:python fix2_report depends on report@
j0 << fix2_context.j0;
@@
msg = "No need to set .owner here. The core will do it."
coccilib.report.print_report(j0[0], msg)
@script:python fix2_i2c_report depends on report@
j0 << fix2_i2c_context.j0;
@@
msg = "No need to set .owner here. The core will do it."
coccilib.report.print_report(j0[0], msg)
3bf7db877d536f'/>
Merge branch 'sparc64-non-resumable-user-error-recovery'
Liam R. Howlett says:
====================
sparc64: Recover from userspace non-resumable PIO & MEM errors
A non-resumable error from userspace is able to cause a kernel panic or trap
loop due to the setup and handling of the queued traps once in the kernel.
This patch series addresses both of these issues.
The queues are fixed by simply zeroing the memory before use.
PIO errors from userspace will result in a SIGBUS being sent to the user
process.
The MEM errors form userspace will result in a SIGKILL and also cause the
offending pages to be claimed so they are no longer used in future tasks.
SIGKILL is used to ensure that the process does not try to coredump and result
in an attempt to read the memory again from within kernel space. Although
there is a HV call to scrub the memory (mem_scrub), there is no easy way to
guarantee that the real memory address(es) are not used by other tasks.
Clearing the error with mem_scrub would zero the memory and cause the other
processes to proceed with bad data.
The handling of other non-resumable errors remain unchanged and will cause a
panic.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>