summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/sun4v/os/error.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/usr/src/uts/sun4v/os/error.c b/usr/src/uts/sun4v/os/error.c
index 4c28d55a68..fd073c834f 100644
--- a/usr/src/uts/sun4v/os/error.c
+++ b/usr/src/uts/sun4v/os/error.c
@@ -459,6 +459,13 @@ cpu_async_log_err(void *flt)
* the page here.
*/
errh_page_retire(errh_fltp);
+
+ /*
+ * If we are going to panic, scrub the page first
+ */
+ if (errh_fltp->cmn_asyncflt.flt_panic)
+ mem_scrub(errh_fltp->errh_er.ra,
+ errh_fltp->errh_er.sz);
}
break;
@@ -563,18 +570,14 @@ void
mem_scrub(uint64_t paddr, uint64_t len)
{
uint64_t pa, length, scrubbed_len;
- uint64_t ret = H_EOK;
pa = paddr;
length = len;
scrubbed_len = 0;
- while (ret == H_EOK) {
- ret = hv_mem_scrub(pa, length, &scrubbed_len);
-
- if (ret == H_EOK || scrubbed_len >= length) {
+ while (length > 0) {
+ if (hv_mem_scrub(pa, length, &scrubbed_len) != H_EOK)
break;
- }
pa += scrubbed_len;
length -= scrubbed_len;
@@ -585,7 +588,6 @@ void
mem_sync(caddr_t va, size_t len)
{
uint64_t pa, length, flushed;
- uint64_t ret = H_EOK;
pa = va_to_pa((caddr_t)va);
@@ -595,12 +597,9 @@ mem_sync(caddr_t va, size_t len)
length = len;
flushed = 0;
- while (ret == H_EOK) {
- ret = hv_mem_sync(pa, length, &flushed);
-
- if (ret == H_EOK || flushed >= length) {
+ while (length > 0) {
+ if (hv_mem_sync(pa, length, &flushed) != H_EOK)
break;
- }
pa += flushed;
length -= flushed;