From 8f8f2f7e94e80b623eeb646f04a5fd7812ec01a9 Mon Sep 17 00:00:00 2001 From: Michael Ellerman Date: Thu, 1 Sep 2005 11:29:08 +1000 Subject: [PATCH] --- yaml --- r: 6687 b: refs/heads/master c: ec60beebed497691c97d674c1facac5ca3d7a4b3 h: refs/heads/master i: 6685: 1c1c89720130d708c2ae85c537cb6a1e45b875fb 6683: 29d487cc1ef56389aa632e9b4525be41bb56f8b2 6679: cbcdcd2c2c623ca44ce6b20c9499a7d7b45b324f 6671: 775053f2324f5e87b19221ae22b51d01be198b9b 6655: 62d18c74c260dd72aeacb5142b555ac8f93a4faa v: v3 --- [refs] | 2 +- trunk/drivers/net/iseries_veth.c | 35 ++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/[refs] b/[refs] index 9909cffe62f4..caaac9085684 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cbf9074cc30ca0eee19c9bd7304faf9f1beb1e76 +refs/heads/master: ec60beebed497691c97d674c1facac5ca3d7a4b3 diff --git a/trunk/drivers/net/iseries_veth.c b/trunk/drivers/net/iseries_veth.c index 91d79db96e82..ab9fb218d111 100644 --- a/trunk/drivers/net/iseries_veth.c +++ b/trunk/drivers/net/iseries_veth.c @@ -683,6 +683,14 @@ static void veth_stop_connection(u8 rlp) /* Wait for the state machine to run. */ flush_scheduled_work(); +} + +static void veth_destroy_connection(u8 rlp) +{ + struct veth_lpar_connection *cnx = veth_cnx[rlp]; + + if (! cnx) + return; if (cnx->num_events > 0) mf_deallocate_lp_events(cnx->remote_lp, @@ -694,14 +702,6 @@ static void veth_stop_connection(u8 rlp) HvLpEvent_Type_VirtualLan, cnx->num_ack_events, NULL, NULL); -} - -static void veth_destroy_connection(u8 rlp) -{ - struct veth_lpar_connection *cnx = veth_cnx[rlp]; - - if (! cnx) - return; kfree(cnx->msgs); kfree(cnx); @@ -1441,15 +1441,24 @@ int __init veth_module_init(void) for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) { rc = veth_init_connection(i); - if (rc != 0) { - veth_module_cleanup(); - return rc; - } + if (rc != 0) + goto error; } HvLpEvent_registerHandler(HvLpEvent_Type_VirtualLan, &veth_handle_event); - return vio_register_driver(&veth_driver); + rc = vio_register_driver(&veth_driver); + if (rc != 0) + goto error; + + return 0; + +error: + for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) { + veth_destroy_connection(i); + } + + return rc; } module_init(veth_module_init);