static void ipmi_unregister_watchdog(int ipmi_intf) { int rv; if (!watchdog_user) goto out; if (watchdog_ifnum != ipmi_intf) goto out; /* Make sure no one can call us any more. */ misc_deregister(&ipmi_wdog_miscdev); /* * Wait to make sure the message makes it out. The lower layer has * pointers to our buffers, we want to make sure they are done before * we release our memory. */ while (atomic_read(&set_timeout_tofree)) schedule_timeout_uninterruptible(1); /* Disconnect from IPMI. */ rv = ipmi_destroy_user(watchdog_user); if (rv) { printk(KERN_WARNING PFX "error unlinking from IPMI: %d\n", rv); } watchdog_user = NULL; out: return; }
static void ipmi_unregister_watchdog(int ipmi_intf) { int rv; if (!watchdog_user) goto out; if (watchdog_ifnum != ipmi_intf) goto out; misc_deregister(&ipmi_wdog_miscdev); while (atomic_read(&set_timeout_tofree)) schedule_timeout_uninterruptible(1); rv = ipmi_destroy_user(watchdog_user); if (rv) { printk(KERN_WARNING PFX "error unlinking from IPMI: %d\n", rv); } watchdog_user = NULL; out: return; }
static int ipmi_release(struct inode *inode, struct file *file) { struct ipmi_file_private *priv = file->private_data; int rv; rv = ipmi_destroy_user(priv->user); if (rv) return rv; /* FIXME - free the messages in the list. */ kfree(priv); return 0; }
static int ipmi_release(struct inode *inode, struct file *file) { struct ipmi_file_private *priv = file->private_data; int rv; rv = ipmi_destroy_user(priv->user); if (rv) return rv; kfree(priv); return 0; }
static int ipmi_release(struct inode *inode, struct file *file) { struct ipmi_file_private *priv = file->private_data; int rv; struct ipmi_recv_msg *msg, *next; rv = ipmi_destroy_user(priv->user); if (rv) return rv; list_for_each_entry_safe(msg, next, &priv->recv_msgs, link) ipmi_free_recv_msg(msg); kfree(priv); return 0; }
static void ipmi_register_watchdog(int ipmi_intf) { int rv = -EBUSY; down_write(®ister_sem); if (watchdog_user) goto out; if ((ifnum_to_use >= 0) && (ifnum_to_use != ipmi_intf)) goto out; watchdog_ifnum = ipmi_intf; rv = ipmi_create_user(ipmi_intf, &ipmi_hndlrs, NULL, &watchdog_user); if (rv < 0) { printk(KERN_CRIT PFX "Unable to register with ipmi\n"); goto out; } ipmi_get_version(watchdog_user, &ipmi_version_major, &ipmi_version_minor); rv = misc_register(&ipmi_wdog_miscdev); if (rv < 0) { ipmi_destroy_user(watchdog_user); watchdog_user = NULL; printk(KERN_CRIT PFX "Unable to register misc device\n"); } out: up_write(®ister_sem); if ((start_now) && (rv == 0)) { /* Run from startup, so start the timer now. */ start_now = 0; /* Disable this function after first startup. */ ipmi_watchdog_state = action_val; ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB); printk(KERN_INFO PFX "Starting now!\n"); } }
static void ipmi_register_watchdog(int ipmi_intf) { int rv = -EBUSY; if (watchdog_user) goto out; if ((ifnum_to_use >= 0) && (ifnum_to_use != ipmi_intf)) goto out; watchdog_ifnum = ipmi_intf; rv = ipmi_create_user(ipmi_intf, &ipmi_hndlrs, NULL, &watchdog_user); if (rv < 0) { #ifdef CONFIG_DEBUG_PRINTK printk(KERN_CRIT PFX "Unable to register with ipmi\n"); #else ; #endif goto out; } ipmi_get_version(watchdog_user, &ipmi_version_major, &ipmi_version_minor); rv = misc_register(&ipmi_wdog_miscdev); if (rv < 0) { ipmi_destroy_user(watchdog_user); watchdog_user = NULL; #ifdef CONFIG_DEBUG_PRINTK printk(KERN_CRIT PFX "Unable to register misc device\n"); #else ; #endif } #ifdef HAVE_DIE_NMI if (nmi_handler_registered) { int old_pretimeout = pretimeout; int old_timeout = timeout; int old_preop_val = preop_val; /* * Set the pretimeout to go off in a second and give * ourselves plenty of time to stop the timer. */ ipmi_watchdog_state = WDOG_TIMEOUT_RESET; preop_val = WDOG_PREOP_NONE; /* Make sure nothing happens */ pretimeout = 99; timeout = 100; testing_nmi = 1; rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB); if (rv) { #ifdef CONFIG_DEBUG_PRINTK printk(KERN_WARNING PFX "Error starting timer to" " test NMI: 0x%x. The NMI pretimeout will" " likely not work\n", rv); #else ; #endif rv = 0; goto out_restore; } msleep(1500); if (testing_nmi != 2) { #ifdef CONFIG_DEBUG_PRINTK printk(KERN_WARNING PFX "IPMI NMI didn't seem to" " occur. The NMI pretimeout will" " likely not work\n"); #else ; #endif } out_restore: testing_nmi = 0; preop_val = old_preop_val; pretimeout = old_pretimeout; timeout = old_timeout; } #endif out: if ((start_now) && (rv == 0)) { /* Run from startup, so start the timer now. */ start_now = 0; /* Disable this function after first startup. */ ipmi_watchdog_state = action_val; ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB); #ifdef CONFIG_DEBUG_PRINTK printk(KERN_INFO PFX "Starting now!\n"); #else ; #endif } else { /* Stop the timer now. */ ipmi_watchdog_state = WDOG_TIMEOUT_NONE; ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB); } }
static void ipmi_register_watchdog(int ipmi_intf) { int rv = -EBUSY; if (watchdog_user) goto out; if ((ifnum_to_use >= 0) && (ifnum_to_use != ipmi_intf)) goto out; watchdog_ifnum = ipmi_intf; rv = ipmi_create_user(ipmi_intf, &ipmi_hndlrs, NULL, &watchdog_user); if (rv < 0) { printk(KERN_CRIT PFX "Unable to register with ipmi\n"); goto out; } ipmi_get_version(watchdog_user, &ipmi_version_major, &ipmi_version_minor); rv = misc_register(&ipmi_wdog_miscdev); if (rv < 0) { ipmi_destroy_user(watchdog_user); watchdog_user = NULL; printk(KERN_CRIT PFX "Unable to register misc device\n"); } #ifdef HAVE_DIE_NMI if (nmi_handler_registered) { int old_pretimeout = pretimeout; int old_timeout = timeout; int old_preop_val = preop_val; ipmi_watchdog_state = WDOG_TIMEOUT_RESET; preop_val = WDOG_PREOP_NONE; pretimeout = 99; timeout = 100; testing_nmi = 1; rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB); if (rv) { printk(KERN_WARNING PFX "Error starting timer to" " test NMI: 0x%x. The NMI pretimeout will" " likely not work\n", rv); rv = 0; goto out_restore; } msleep(1500); if (testing_nmi != 2) { printk(KERN_WARNING PFX "IPMI NMI didn't seem to" " occur. The NMI pretimeout will" " likely not work\n"); } out_restore: testing_nmi = 0; preop_val = old_preop_val; pretimeout = old_pretimeout; timeout = old_timeout; } #endif out: if ((start_now) && (rv == 0)) { start_now = 0; ipmi_watchdog_state = action_val; ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB); printk(KERN_INFO PFX "Starting now!\n"); } else { ipmi_watchdog_state = WDOG_TIMEOUT_NONE; ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB); } }