Re: [RFC] ehea: kdump support using new shutdown hook

2007-12-13 Thread Subrata Modak
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

2007-12-12 Thread Michael Ellerman
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

2007-12-12 Thread Michael Ellerman
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

2007-12-12 Thread Dave Jones
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

2007-12-12 Thread Thomas Klein
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