On 10/5/10 12:04 AM, Bhanu Gollapudi wrote: > Incorporated Joe's review comments. > > When number of NPIV ports created are greater than the xids > allocated per pool -- for eg., creating 255 NPIV ports on a > system with nr_cpu_ids of 32, with each pool containing 128 > xids -- and then generating a link event - for eg., > shutdown/no shutdown -- on the switch port causes the hang > with the following stack trace. > > Call Trace: > schedule_timeout+0x19d/0x230 > wait_for_common+0xc0/0x170 > __cancel_work_timer+0xcf/0x1b0 > fc_disc_stop+0x16/0x30 [libfc] > fc_lport_reset_locked+0x47/0x90 [libfc] > fc_lport_enter_reset+0x67/0xe0 [libfc] > fc_lport_disc_callback+0xbc/0xe0 [libfc] > fc_disc_done+0xa8/0xf0 [libfc] > fc_disc_timeout+0x29/0x40 [libfc] > run_workqueue+0xb8/0x140 > worker_thread+0x96/0x110 > kthread+0x96/0xa0 > child_rip+0xa/0x20 > > Fix is to not cancel the disc_work if discovery is already > stopped, thus allowing lport state machine to restart and try > discovery again. > > Signed-off-by: Bhanu Prakash Gollapudi <[email protected]>
Looks good. Acked-by: Joe Eykholt <[email protected]> > --- > drivers/scsi/libfc/fc_disc.c | 5 ++--- > include/scsi/libfc.h | 2 +- > 2 files changed, 3 insertions(+), 4 deletions(-) > > diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c > index 32f67c4..911b273 100644 > --- a/drivers/scsi/libfc/fc_disc.c > +++ b/drivers/scsi/libfc/fc_disc.c > @@ -684,10 +684,9 @@ void fc_disc_stop(struct fc_lport *lport) > { > struct fc_disc *disc = &lport->disc; > > - if (disc) { > + if (disc->pending) > cancel_delayed_work_sync(&disc->disc_work); > - fc_disc_stop_rports(disc); > - } > + fc_disc_stop_rports(disc); > } > > /** > diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h > index 74e0985..f049c06 100644 > --- a/include/scsi/libfc.h > +++ b/include/scsi/libfc.h > @@ -736,7 +736,7 @@ struct libfc_function_template { > * struct fc_disc - Discovery context > * @retry_count: Number of retries > * @pending: 1 if discovery is pending, 0 if not > - * @requesting: 1 if discovery has been requested, 0 if not > + * @requested: 1 if discovery has been requested, 0 if not > * @seq_count: Number of sequences used for discovery > * @buf_len: Length of the discovery buffer > * @disc_id: Discovery ID _______________________________________________ devel mailing list [email protected] http://www.open-fcoe.org/mailman/listinfo/devel
