aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2023-09-13 22:43:24 +0100
committerMichael Brown <mcb30@ipxe.org>2023-09-14 12:55:56 +0100
commit8cbf248198f3bc66c52b2340b4decf293af8af47 (patch)
tree0f5d2ebeeb4c66f2e4121f4e26b39fd0336a7984
parent8b1d34badf321668f830c78e6803d718446b57ef (diff)
downloadipxe-8cbf248198f3bc66c52b2340b4decf293af8af47.zip
ipxe-8cbf248198f3bc66c52b2340b4decf293af8af47.tar.gz
ipxe-8cbf248198f3bc66c52b2340b4decf293af8af47.tar.bz2
[vmware] Use driver-private data to hold GuestInfo settings block
Simplify the per-netdevice GuestInfo settings code by using driver-private data to hold the settings block, instead of using a separate allocation. The settings block (if existent) will be automatically unregistered when the parent network device settings block is unregistered, and no longer needs to be separately freed. The guestinfo_net_remove() function may therefore be omitted completely. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/arch/x86/interface/vmware/guestinfo.c48
1 files changed, 7 insertions, 41 deletions
diff --git a/src/arch/x86/interface/vmware/guestinfo.c b/src/arch/x86/interface/vmware/guestinfo.c
index b52c2e8..4134515 100644
--- a/src/arch/x86/interface/vmware/guestinfo.c
+++ b/src/arch/x86/interface/vmware/guestinfo.c
@@ -210,66 +210,32 @@ struct init_fn guestinfo_init_fn __init_fn ( INIT_NORMAL ) = {
* @v priv Private data
* @ret rc Return status code
*/
-static int guestinfo_net_probe ( struct net_device *netdev,
- void *priv __unused ) {
- struct settings *settings;
+static int guestinfo_net_probe ( struct net_device *netdev, void *priv ) {
+ struct settings *settings = priv;
int rc;
/* Do nothing unless we have a GuestInfo channel available */
if ( guestinfo_channel < 0 )
return 0;
- /* Allocate and initialise settings block */
- settings = zalloc ( sizeof ( *settings ) );
- if ( ! settings ) {
- rc = -ENOMEM;
- goto err_alloc;
- }
- settings_init ( settings, &guestinfo_settings_operations, NULL, NULL );
-
- /* Register settings */
+ /* Initialise and register settings */
+ settings_init ( settings, &guestinfo_settings_operations,
+ &netdev->refcnt, NULL );
if ( ( rc = register_settings ( settings, netdev_settings ( netdev ),
"vmware" ) ) != 0 ) {
DBGC ( settings, "GuestInfo %p could not register for %s: %s\n",
settings, netdev->name, strerror ( rc ) );
- goto err_register;
+ return rc;
}
DBGC ( settings, "GuestInfo %p registered for %s\n",
settings, netdev->name );
return 0;
-
- err_register:
- free ( settings );
- err_alloc:
- return rc;
-}
-
-/**
- * Remove per-netdevice GuestInfo settings
- *
- * @v netdev Network device
- * @v priv Private data
- */
-static void guestinfo_net_remove ( struct net_device *netdev,
- void *priv __unused ) {
- struct settings *parent = netdev_settings ( netdev );
- struct settings *settings;
-
- list_for_each_entry ( settings, &parent->children, siblings ) {
- if ( settings->op == &guestinfo_settings_operations ) {
- DBGC ( settings, "GuestInfo %p unregistered for %s\n",
- settings, netdev->name );
- unregister_settings ( settings );
- free ( settings );
- return;
- }
- }
}
/** GuestInfo per-netdevice driver */
struct net_driver guestinfo_net_driver __net_driver = {
.name = "GuestInfo",
+ .priv_len = sizeof ( struct settings ),
.probe = guestinfo_net_probe,
- .remove = guestinfo_net_remove,
};