Re: [RFC] ehea: kdump support using new shutdown hook
Do you think we can improve upon our own LTP-KDUMP test cases housed here: http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kdump/, because of your changes below: --Subrata On Wed, 2007-12-12 at 17:53 +0100, Thomas Klein wrote: > This patch adds kdump support using the new PPC crash shutdown hook to the > ehea driver. The driver now keeps a list of firmware handles which have to > be freed in case of a crash. The crash handler does the minimum required: it > frees the firmware resource handles plus broadcast/multicast registrations. > > Please comment. > > Shutdown hook patches: > http://ozlabs.org/pipermail/linuxppc-dev/2007-December/048058.html > http://ozlabs.org/pipermail/linuxppc-dev/2007-December/048059.html > > > Signed-off-by: Thomas Klein <[EMAIL PROTECTED]> > > --- > diff -Nurp -X dontdiff linux-2.6.24-rc5/drivers/net/ehea/ehea.h > patched_kernel/drivers/net/ehea/ehea.h > --- linux-2.6.24-rc5/drivers/net/ehea/ehea.h 2007-12-11 04:48:43.0 > +0100 > +++ patched_kernel/drivers/net/ehea/ehea.h2007-12-12 17:30:53.0 > +0100 > @@ -40,7 +40,7 @@ > #include > > #define DRV_NAME "ehea" > -#define DRV_VERSION "EHEA_0083" > +#define DRV_VERSION "EHEA_0084" > > /* eHEA capability flags */ > #define DLPAR_PORT_ADD_REM 1 > @@ -386,6 +386,7 @@ struct ehea_port_res { > > > #define EHEA_MAX_PORTS 16 > +#define EHEA_MAX_RES_HANDLES (100 * EHEA_MAX_PORTS + 10) > struct ehea_adapter { > u64 handle; > struct of_device *ofdev; > @@ -397,6 +398,7 @@ struct ehea_adapter { > u64 max_mc_mac;/* max number of multicast mac addresses */ > int active_ports; > struct list_head list; > + u64 res_handles[EHEA_MAX_RES_HANDLES]; > }; > > > diff -Nurp -X dontdiff linux-2.6.24-rc5/drivers/net/ehea/ehea_main.c > patched_kernel/drivers/net/ehea/ehea_main.c > --- linux-2.6.24-rc5/drivers/net/ehea/ehea_main.c 2007-12-11 > 04:48:43.0 +0100 > +++ patched_kernel/drivers/net/ehea/ehea_main.c 2007-12-12 > 17:30:53.0 +0100 > @@ -35,6 +35,7 @@ > #include > #include > #include > +#include > > #include > > @@ -2256,6 +2257,33 @@ static int ehea_clean_all_portres(struct > return ret; > } > > +static void ehea_update_adapter_handles(struct ehea_adapter *adapter) > +{ > + int i, k; > + int j = 0; > + > + memset(adapter->res_handles, sizeof(adapter->res_handles), 0); > + > + for (k = 0; k < EHEA_MAX_PORTS; k++) { > + struct ehea_port *port = adapter->port[k]; > + > + if (!port || (port->state != EHEA_PORT_UP)) > + continue; > + > + for(i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++) { > + struct ehea_port_res *pr = &port->port_res[i]; > + > + adapter->res_handles[j++] = pr->qp->fw_handle; > + adapter->res_handles[j++] = pr->send_cq->fw_handle; > + adapter->res_handles[j++] = pr->recv_cq->fw_handle; > + adapter->res_handles[j++] = pr->eq->fw_handle; > + adapter->res_handles[j++] = pr->send_mr.handle; > + adapter->res_handles[j++] = pr->recv_mr.handle; > + } > + adapter->res_handles[j++] = port->qp_eq->fw_handle; > + } > +} > + > static void ehea_remove_adapter_mr(struct ehea_adapter *adapter) > { > if (adapter->active_ports) > @@ -2318,6 +2346,7 @@ static int ehea_up(struct net_device *de > > ret = 0; > port->state = EHEA_PORT_UP; > + ehea_update_adapter_handles(port->adapter); > goto out; > > out_free_irqs: > @@ -2387,6 +2416,8 @@ static int ehea_down(struct net_device * > ehea_info("Failed freeing resources for %s. ret=%i", > dev->name, ret); > > + ehea_update_adapter_handles(port->adapter); > + > return ret; > } > > @@ -3302,6 +,71 @@ static int __devexit ehea_remove(struct > return 0; > } > > +void ehea_crash_deregister(void) > +{ > + struct ehea_adapter *adapter; > + int i; > + u64 hret; > + u8 reg_type; > + > + list_for_each_entry(adapter, &adapter_list, list) { > + for (i = 0; i < EHEA_MAX_PORTS; i++) { > + struct ehea_port *port = adapter->port[i]; > + if (port->state == EHEA_PORT_UP) { > + struct ehea_mc_list *mc_entry = port->mc_list; > + struct list_head *pos; > + struct list_head *temp; > + > + /* Undo multicast registrations */ > + list_for_each_safe(pos, temp, > +&(port->mc_list->list)) { > + mc_entry = list_entry(pos, > + struct ehea_mc_list, > + li
Re: [RFC] ehea: kdump support using new shutdown hook
On Wed, 2007-12-12 at 17:53 +0100, Thomas Klein wrote: > This patch adds kdump support using the new PPC crash shutdown hook to the > ehea driver. The driver now keeps a list of firmware handles which have to > be freed in case of a crash. The crash handler does the minimum required: it > frees the firmware resource handles plus broadcast/multicast registrations. > > Please comment. Hi Thomas, Here's a few .. > --- > diff -Nurp -X dontdiff linux-2.6.24-rc5/drivers/net/ehea/ehea.h > patched_kernel/drivers/net/ehea/ehea.h > --- linux-2.6.24-rc5/drivers/net/ehea/ehea.h 2007-12-11 04:48:43.0 > +0100 > +++ patched_kernel/drivers/net/ehea/ehea.h2007-12-12 17:30:53.0 > +0100 > @@ -386,6 +386,7 @@ struct ehea_port_res { > > > #define EHEA_MAX_PORTS 16 > +#define EHEA_MAX_RES_HANDLES (100 * EHEA_MAX_PORTS + 10) > struct ehea_adapter { > u64 handle; > struct of_device *ofdev; > @@ -397,6 +398,7 @@ struct ehea_adapter { > u64 max_mc_mac;/* max number of multicast mac addresses */ > int active_ports; > struct list_head list; > + u64 res_handles[EHEA_MAX_RES_HANDLES]; > }; I don't like this .. > diff -Nurp -X dontdiff linux-2.6.24-rc5/drivers/net/ehea/ehea_main.c > patched_kernel/drivers/net/ehea/ehea_main.c > --- linux-2.6.24-rc5/drivers/net/ehea/ehea_main.c 2007-12-11 > 04:48:43.0 +0100 > +++ patched_kernel/drivers/net/ehea/ehea_main.c 2007-12-12 > 17:30:53.0 +0100 > @@ -35,6 +35,7 @@ > #include > #include > #include > +#include Just > @@ -3302,6 +,71 @@ static int __devexit ehea_remove(struct > return 0; > } > > +void ehea_crash_deregister(void) > +{ > + struct ehea_adapter *adapter; > + int i; > + u64 hret; > + u8 reg_type; > + > + list_for_each_entry(adapter, &adapter_list, list) { > + for (i = 0; i < EHEA_MAX_PORTS; i++) { > + struct ehea_port *port = adapter->port[i]; > + if (port->state == EHEA_PORT_UP) { > + struct ehea_mc_list *mc_entry = port->mc_list; > + struct list_head *pos; > + struct list_head *temp; > + > + /* Undo multicast registrations */ > + list_for_each_safe(pos, temp, > +&(port->mc_list->list)) { > + mc_entry = list_entry(pos, > + struct ehea_mc_list, > + list); > + ehea_multicast_reg_helper(port, > + mc_entry->macaddr, > + H_DEREG_BCMC); > + } > + > + /* Undo broad registration */ > + reg_type = EHEA_BCMC_BROADCAST | > +EHEA_BCMC_UNTAGGED; > + ehea_h_reg_dereg_bcmc(port->adapter->handle, > + port->logical_port_id, > + reg_type, port->mac_addr, > + 0, H_DEREG_BCMC); > + > + reg_type = EHEA_BCMC_BROADCAST | > +EHEA_BCMC_VLANID_ALL; > + ehea_h_reg_dereg_bcmc(port->adapter->handle, > + port->logical_port_id, > + reg_type, port->mac_addr, > + 0, H_DEREG_BCMC); > + } > + } > + for (i = 0; i < EHEA_MAX_RES_HANDLES; i++) { > + u64 handle = adapter->res_handles[i]; > + if (handle) { > + hret = ehea_h_free_resource(adapter->handle, > + handle, > + FORCE_FREE); > + } > + } > + > + if (adapter->neq) { > + hret = ehea_h_free_resource(adapter->handle, > + adapter->neq->fw_handle, > + FORCE_FREE); > + } > + > + if (adapter->mr.handle) { > + hret = ehea_h_free_resource(adapter->handle, > + adapter->mr.handle, > + FORCE_FREE); > + } > + } > +} This is sort of on the right track, I like that the ehea_h_.. routines are basically just hypercalls, but there's a few
Re: [RFC] ehea: kdump support using new shutdown hook
On Wed, 2007-12-12 at 12:04 -0500, Dave Jones wrote: > On Wed, Dec 12, 2007 at 05:53:43PM +0100, Thomas Klein wrote: > > > +static void ehea_update_adapter_handles(struct ehea_adapter *adapter) > > +{ > > + int i, k; > > + int j = 0; > > + > > + memset(adapter->res_handles, sizeof(adapter->res_handles), 0); > > arguments wrong way around. Remind me why bzero is deprecated again? :) cheers -- Michael Ellerman OzLabs, IBM Australia Development Lab wwweb: http://michael.ellerman.id.au phone: +61 2 6212 1183 (tie line 70 21183) We do not inherit the earth from our ancestors, we borrow it from our children. - S.M.A.R.T Person signature.asc Description: This is a digitally signed message part
Re: [RFC] ehea: kdump support using new shutdown hook
On Wed, Dec 12, 2007 at 05:53:43PM +0100, Thomas Klein wrote: > +static void ehea_update_adapter_handles(struct ehea_adapter *adapter) > +{ > +int i, k; > +int j = 0; > + > +memset(adapter->res_handles, sizeof(adapter->res_handles), 0); arguments wrong way around. Dave -- http://www.codemonkey.org.uk -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[RFC] ehea: kdump support using new shutdown hook
This patch adds kdump support using the new PPC crash shutdown hook to the ehea driver. The driver now keeps a list of firmware handles which have to be freed in case of a crash. The crash handler does the minimum required: it frees the firmware resource handles plus broadcast/multicast registrations. Please comment. Shutdown hook patches: http://ozlabs.org/pipermail/linuxppc-dev/2007-December/048058.html http://ozlabs.org/pipermail/linuxppc-dev/2007-December/048059.html Signed-off-by: Thomas Klein <[EMAIL PROTECTED]> --- diff -Nurp -X dontdiff linux-2.6.24-rc5/drivers/net/ehea/ehea.h patched_kernel/drivers/net/ehea/ehea.h --- linux-2.6.24-rc5/drivers/net/ehea/ehea.h2007-12-11 04:48:43.0 +0100 +++ patched_kernel/drivers/net/ehea/ehea.h 2007-12-12 17:30:53.0 +0100 @@ -40,7 +40,7 @@ #include #define DRV_NAME "ehea" -#define DRV_VERSION"EHEA_0083" +#define DRV_VERSION"EHEA_0084" /* eHEA capability flags */ #define DLPAR_PORT_ADD_REM 1 @@ -386,6 +386,7 @@ struct ehea_port_res { #define EHEA_MAX_PORTS 16 +#define EHEA_MAX_RES_HANDLES (100 * EHEA_MAX_PORTS + 10) struct ehea_adapter { u64 handle; struct of_device *ofdev; @@ -397,6 +398,7 @@ struct ehea_adapter { u64 max_mc_mac;/* max number of multicast mac addresses */ int active_ports; struct list_head list; + u64 res_handles[EHEA_MAX_RES_HANDLES]; }; diff -Nurp -X dontdiff linux-2.6.24-rc5/drivers/net/ehea/ehea_main.c patched_kernel/drivers/net/ehea/ehea_main.c --- linux-2.6.24-rc5/drivers/net/ehea/ehea_main.c 2007-12-11 04:48:43.0 +0100 +++ patched_kernel/drivers/net/ehea/ehea_main.c 2007-12-12 17:30:53.0 +0100 @@ -35,6 +35,7 @@ #include #include #include +#include #include @@ -2256,6 +2257,33 @@ static int ehea_clean_all_portres(struct return ret; } +static void ehea_update_adapter_handles(struct ehea_adapter *adapter) +{ + int i, k; + int j = 0; + + memset(adapter->res_handles, sizeof(adapter->res_handles), 0); + + for (k = 0; k < EHEA_MAX_PORTS; k++) { + struct ehea_port *port = adapter->port[k]; + + if (!port || (port->state != EHEA_PORT_UP)) + continue; + + for(i = 0; i < port->num_def_qps + port->num_add_tx_qps; i++) { + struct ehea_port_res *pr = &port->port_res[i]; + + adapter->res_handles[j++] = pr->qp->fw_handle; + adapter->res_handles[j++] = pr->send_cq->fw_handle; + adapter->res_handles[j++] = pr->recv_cq->fw_handle; + adapter->res_handles[j++] = pr->eq->fw_handle; + adapter->res_handles[j++] = pr->send_mr.handle; + adapter->res_handles[j++] = pr->recv_mr.handle; + } + adapter->res_handles[j++] = port->qp_eq->fw_handle; + } +} + static void ehea_remove_adapter_mr(struct ehea_adapter *adapter) { if (adapter->active_ports) @@ -2318,6 +2346,7 @@ static int ehea_up(struct net_device *de ret = 0; port->state = EHEA_PORT_UP; + ehea_update_adapter_handles(port->adapter); goto out; out_free_irqs: @@ -2387,6 +2416,8 @@ static int ehea_down(struct net_device * ehea_info("Failed freeing resources for %s. ret=%i", dev->name, ret); + ehea_update_adapter_handles(port->adapter); + return ret; } @@ -3302,6 +,71 @@ static int __devexit ehea_remove(struct return 0; } +void ehea_crash_deregister(void) +{ + struct ehea_adapter *adapter; + int i; + u64 hret; + u8 reg_type; + + list_for_each_entry(adapter, &adapter_list, list) { + for (i = 0; i < EHEA_MAX_PORTS; i++) { + struct ehea_port *port = adapter->port[i]; + if (port->state == EHEA_PORT_UP) { + struct ehea_mc_list *mc_entry = port->mc_list; + struct list_head *pos; + struct list_head *temp; + + /* Undo multicast registrations */ + list_for_each_safe(pos, temp, + &(port->mc_list->list)) { + mc_entry = list_entry(pos, + struct ehea_mc_list, + list); + ehea_multicast_reg_helper(port, + mc_entry->macaddr, + H_DEREG_BCMC); + } + + /* Undo broad registration */ + reg_type = EHE