From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50784) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bQH9z-0004YJ-H0 for qemu-devel@nongnu.org; Thu, 21 Jul 2016 12:49:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bQH9v-0004hn-DM for qemu-devel@nongnu.org; Thu, 21 Jul 2016 12:49:19 -0400 Received: from mail-oi0-x241.google.com ([2607:f8b0:4003:c06::241]:33479) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bQH9v-0004hg-5L for qemu-devel@nongnu.org; Thu, 21 Jul 2016 12:49:15 -0400 Received: by mail-oi0-x241.google.com with SMTP id l9so8214669oih.0 for ; Thu, 21 Jul 2016 09:49:15 -0700 (PDT) Sender: Corey Minyard From: minyard@acm.org Date: Thu, 21 Jul 2016 11:49:07 -0500 Message-Id: <1469119749-31181-2-git-send-email-minyard@acm.org> In-Reply-To: <1469119749-31181-1-git-send-email-minyard@acm.org> References: <1469119749-31181-1-git-send-email-minyard@acm.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH v2 1/3] ipmi_bmc_sim: Add a proper unrealize function List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , minyard@acm.org, Corey Minyard From: Corey Minyard Add an unrealize function to free the timer allocated in the realize function, unregsiter the vmstate, and free any pending messages. Also, get rid of the unnecessary mutex, it was a vestige of something else that was not done. That way we don't have to free it. Signed-off-by: Corey Minyard Cc: Marc-André Lureau --- hw/ipmi/ipmi_bmc_sim.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/hw/ipmi/ipmi_bmc_sim.c b/hw/ipmi/ipmi_bmc_sim.c index dc9c14c..fe92b93 100644 --- a/hw/ipmi/ipmi_bmc_sim.c +++ b/hw/ipmi/ipmi_bmc_sim.c @@ -217,7 +217,6 @@ struct IPMIBmcSim { /* Odd netfns are for responses, so we only need the even ones. */ const IPMINetfn *netfns[MAX_NETFNS / 2]; - QemuMutex lock; /* We allow one event in the buffer */ uint8_t evtbuf[16]; @@ -940,7 +939,6 @@ static void get_msg(IPMIBmcSim *ibs, { IPMIRcvBufEntry *msg; - qemu_mutex_lock(&ibs->lock); if (QTAILQ_EMPTY(&ibs->rcvbufs)) { rsp_buffer_set_error(rsp, 0x80); /* Queue empty */ goto out; @@ -960,7 +958,6 @@ static void get_msg(IPMIBmcSim *ibs, } out: - qemu_mutex_unlock(&ibs->lock); return; } @@ -1055,11 +1052,9 @@ static void send_msg(IPMIBmcSim *ibs, end_msg: msg->buf[msg->len] = ipmb_checksum(msg->buf, msg->len, 0); msg->len++; - qemu_mutex_lock(&ibs->lock); QTAILQ_INSERT_TAIL(&ibs->rcvbufs, msg, entry); ibs->msg_flags |= IPMI_BMC_MSG_FLAG_RCV_MSG_QUEUE; k->set_atn(s, 1, attn_irq_enabled(ibs)); - qemu_mutex_unlock(&ibs->lock); } static void do_watchdog_reset(IPMIBmcSim *ibs) @@ -1753,7 +1748,6 @@ static void ipmi_sim_realize(DeviceState *dev, Error **errp) unsigned int i; IPMIBmcSim *ibs = IPMI_BMC_SIMULATOR(b); - qemu_mutex_init(&ibs->lock); QTAILQ_INIT(&ibs->rcvbufs); ibs->bmc_global_enables = (1 << IPMI_BMC_EVENT_LOG_BIT); @@ -1786,12 +1780,28 @@ static void ipmi_sim_realize(DeviceState *dev, Error **errp) vmstate_register(NULL, 0, &vmstate_ipmi_sim, ibs); } +static void ipmi_sim_unrealize(DeviceState *dev, Error **errp) +{ + IPMIBmc *b = IPMI_BMC(dev); + IPMIRcvBufEntry *msg, *tmp; + IPMIBmcSim *ibs = IPMI_BMC_SIMULATOR(b); + + vmstate_unregister(NULL, &vmstate_ipmi_sim, ibs); + timer_del(ibs->timer); + timer_free(ibs->timer); + QTAILQ_FOREACH_SAFE(msg, &ibs->rcvbufs, entry, tmp) { + QTAILQ_REMOVE(&ibs->rcvbufs, msg, entry); + g_free(msg); + } +} + static void ipmi_sim_class_init(ObjectClass *oc, void *data) { DeviceClass *dc = DEVICE_CLASS(oc); IPMIBmcClass *bk = IPMI_BMC_CLASS(oc); dc->realize = ipmi_sim_realize; + dc->unrealize = ipmi_sim_unrealize; bk->handle_command = ipmi_sim_handle_command; } -- 2.7.4