From 5737e514d00ff802f6f846c80e4804727c43c0ab Mon Sep 17 00:00:00 2001 From: Aaron Young Date: Wed, 18 Jan 2017 09:42:01 -0500 Subject: [PATCH] SPARC64: UEK4 LDOMS DOMAIN SERVICES UPDATE 7 This update fixes the following issues for LDom domain services on UEK4: 1. Kernel watchdog panic when unbinding guest domains. This panic was due to the ds driver accessing a freed data structure out of ds_remove(). 2. "no service registered for UNREG_REQ handle" error messages on the console when ldmd is restarted. Signed-off-by: Aaron Young Reviewed-By: Bijan Mottahedeh Reviewed-By: Liam Merwick Orabug: 25408406, 25366664 Signed-off-by: Allen Pais --- arch/sparc/kernel/ds.c | 9 ++++++++- arch/sparc/kernel/ldc.c | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index 1eee3189b1fd..06b5e227639d 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c @@ -3400,7 +3400,7 @@ static int ds_handshake_reg(struct ds_dev *ds, struct ds_msg_tag *pkt) if (svc_info == NULL) { /* There is no service */ - pr_err("ds-%llu: no service registered for " + dprintk3("ds-%llu: no service registered for " "UNREG_REQ handle %llx\n", ds->id, unreg_req->payload.handle); @@ -4681,6 +4681,13 @@ static int ds_remove(struct vio_dev *vdev) ldc_free(ds->lp); + /* + * Since the ds_dev can remain for a while til it's + * freed (callout queue), to make sure the lp isn't used, + * we set it to NULL here. + */ + ds->lp = NULL; + /* free any entries left on the callout list */ list_for_each_entry_safe(qhdrp, tmp, &ds->callout_list, list) { list_del(&qhdrp->list); diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c index c0daced1b14c..3c90408ea2de 100644 --- a/arch/sparc/kernel/ldc.c +++ b/arch/sparc/kernel/ldc.c @@ -780,6 +780,9 @@ void ldc_enable_hv_intr(struct ldc_channel *lp) { unsigned long flags; + if (!lp) + return; + spin_lock_irqsave(&lp->lock, flags); ldcdbg(RX, "ldc_enable_hv_intr: dh=%llu, ino=%llu\n", @@ -797,6 +800,9 @@ void ldc_disable_hv_intr(struct ldc_channel *lp) { unsigned long flags; + if (!lp) + return; + spin_lock_irqsave(&lp->lock, flags); ldcdbg(RX, "ldc_disable_hv_intr: dh=%llu, ino=%llu\n", -- 2.50.1