arcmsr: fixed calling scsi_scan_host after all initialization done
From: Ching<[email protected]>
This is a new patch after patch v1.1 series.
Fixed calling scsi_scan_host until all initialization are done. And fixed error path free allocated resource.
---
drivers/scsi/arcmsr/arcmsr_hba.c +9 -5
@@ -112,6 +112,7 @@ static void arcmsr_hbaD_message_isr(strustatic void arcmsr_hardware_reset (struct AdapterControlBlock *acb);static const char *arcmsr_info (struct Scsi_Host *);static irqreturn_t arcmsr_interrupt (struct AdapterControlBlock *acb); +static void arcmsr_free_irq (struct pci_dev *,struct AdapterControlBlock *);static int arcmsr_adjust_disk_queue_depth (struct scsi_device *sdev,int queue_depth,int reason) {
@@ -778,12 +779,11 @@ static int arcmsr_probe(struct pci_dev * } error =scsi_add_host (host, &pdev->dev);if (error){ - goto RAID_controller_stop; + goto free_ccb_pool; }if (arcmsr_request_irq (pdev, acb) ==ARC_FAILURE ) goto scsi_host_remove;arcmsr_iop_init (acb); -scsi_scan_host (host);INIT_WORK (&acb->arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);atomic_set (&acb->rq_map_token,16 );atomic_set (&acb->ante_token_value,16 );
@@ -795,13 +795,17 @@ static int arcmsr_probe(struct pci_dev *add_timer (&acb->eternal_timer);if (arcmsr_alloc_sysfs_attr (acb)) goto out_free_sysfs; +scsi_scan_host (host);return 0 ; out_free_sysfs: -scsi_host_remove: -scsi_remove_host (host); -RAID_controller_stop: +del_timer_sync (&acb->eternal_timer); +flush_work (&acb->arcmsr_do_message_isr_bh);arcmsr_stop_adapter_bgrb (acb);arcmsr_flush_adapter_cache (acb); +arcmsr_free_irq (pdev, acb); +scsi_host_remove: +scsi_remove_host (host); +free_ccb_pool:arcmsr_free_ccb_pool (acb); free_hbb_mu:arcmsr_free_mu (acb);
Quoted 37 lines · ching
From: Ching<[email protected]>
This is a new patch after patch v1.1 series.
Fixed calling
scsi_scan_hostuntil all initialization are done. And fixed error path free allocated resource.Signed-off-by Ching<[email protected]>---
diff -uprN
a/drivers/scsi/arcmsr/arcmsr_hba.cb/drivers/scsi/arcmsr/arcmsr_hba.cdrivers/scsi/arcmsr/arcmsr_hba.c +2
-2@@ -112,6 +112,7 @@ static void arcmsr_hbaD_message_isr(strustatic void arcmsr_hardware_reset (struct AdapterControlBlock *acb);static const char *arcmsr_info (struct Scsi_Host *);static irqreturn_t arcmsr_interrupt (struct AdapterControlBlock *acb); +static void arcmsr_free_irq (struct pci_dev *,struct AdapterControlBlock *);static int arcmsr_adjust_disk_queue_depth (struct scsi_device *sdev,int queue_depth,int reason) {@@ -778,12 +779,11 @@ static int arcmsr_probe(struct pci_dev * } error =scsi_add_host (host, &pdev->dev);if (error){ - goto RAID_controller_stop; + goto free_ccb_pool; }if (arcmsr_request_irq (pdev, acb) ==ARC_FAILURE ) goto scsi_host_remove;arcmsr_iop_init (acb); -scsi_scan_host (host);INIT_WORK (&acb->arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);atomic_set (&acb->rq_map_token,16 );atomic_set (&acb->ante_token_value,16 );@@ -795,13 +795,17 @@ static int arcmsr_probe(struct pci_dev *add_timer (&acb->eternal_timer);
drivers/scsi/arcmsr/arcmsr_hba.c static int arcmsr_probe(struct pci_dev * · line 802
Quoted 10 lines
drivers/scsi/arcmsr/arcmsr_hba.c +3
-3if (arcmsr_alloc_sysfs_attr (acb)) goto out_free_sysfs; +scsi_scan_host (host);return 0 ; out_free_sysfs: -scsi_host_remove: -scsi_remove_host (host); -RAID_controller_stop: +del_timer_sync (&acb->eternal_timer); +flush_work (&acb->arcmsr_do_message_isr_bh);
In your driver you use both flush_work(struct work_struct *) and flush_scheduled_work(), the second form is used used to flush the shared workqueue.
That said (and I think you use just one queue) you should decide which one is correct. In my previous mail I have asked about flush_work because i have it seen elsewhere in your code, now I've noticed the use of schedule_work and that means that you are using the global wq.
Quoted 15 lines
drivers/scsi/arcmsr/arcmsr_hba.c +4
-1arcmsr_stop_adapter_bgrb (acb);arcmsr_flush_adapter_cache (acb); +arcmsr_free_irq (pdev, acb); +scsi_host_remove: +scsi_remove_host (host); +free_ccb_pool:arcmsr_free_ccb_pool (acb); free_hbb_mu:arcmsr_free_mu (acb); --To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Tomas,
Then I will have a patch 18/16 to replace flush_scheduled_work with flush_work. Thanks for your advice.
Quoted 72 lines · Tomas Henzl
Quoted 37 lines · ching
From: Ching<[email protected]>
This is a new patch after patch v1.1 series.
Fixed calling
scsi_scan_hostuntil all initialization are done. And fixed error path free allocated resource.Signed-off-by Ching<[email protected]>---
diff -uprN
a/drivers/scsi/arcmsr/arcmsr_hba.cb/drivers/scsi/arcmsr/arcmsr_hba.cdrivers/scsi/arcmsr/arcmsr_hba.c +2
-2@@ -112,6 +112,7 @@ static void arcmsr_hbaD_message_isr(strustatic void arcmsr_hardware_reset (struct AdapterControlBlock *acb);static const char *arcmsr_info (struct Scsi_Host *);static irqreturn_t arcmsr_interrupt (struct AdapterControlBlock *acb); +static void arcmsr_free_irq (struct pci_dev *,struct AdapterControlBlock *);static int arcmsr_adjust_disk_queue_depth (struct scsi_device *sdev,int queue_depth,int reason) {@@ -778,12 +779,11 @@ static int arcmsr_probe(struct pci_dev * } error =scsi_add_host (host, &pdev->dev);if (error){ - goto RAID_controller_stop; + goto free_ccb_pool; }if (arcmsr_request_irq (pdev, acb) ==ARC_FAILURE ) goto scsi_host_remove;arcmsr_iop_init (acb); -scsi_scan_host (host);INIT_WORK (&acb->arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);atomic_set (&acb->rq_map_token,16 );atomic_set (&acb->ante_token_value,16 );@@ -795,13 +795,17 @@ static int arcmsr_probe(struct pci_dev *add_timer (&acb->eternal_timer);drivers/scsi/arcmsr/arcmsr_hba.c static int arcmsr_probe(struct pci_dev * · line 802
Quoted 10 lines
drivers/scsi/arcmsr/arcmsr_hba.c +3
-3if (arcmsr_alloc_sysfs_attr (acb)) goto out_free_sysfs; +scsi_scan_host (host);return 0 ; out_free_sysfs: -scsi_host_remove: -scsi_remove_host (host); -RAID_controller_stop: +del_timer_sync (&acb->eternal_timer); +flush_work (&acb->arcmsr_do_message_isr_bh);In your driver you use both
flush_work(struct work_struct *)andflush_scheduled_work(), the second form is used used to flush the shared workqueue.
That said (and I think you use just one queue) you should decide which one is correct. In my previous mail I have asked aboutflush_workbecause i have it seen elsewhere in your code, now I've noticed the use ofschedule_workand that means that you are using the global wq.Quoted 15 lines
drivers/scsi/arcmsr/arcmsr_hba.c +4
-1arcmsr_stop_adapter_bgrb (acb);arcmsr_flush_adapter_cache (acb); +arcmsr_free_irq (pdev, acb); +scsi_host_remove: +scsi_remove_host (host); +free_ccb_pool:arcmsr_free_ccb_pool (acb); free_hbb_mu:arcmsr_free_mu (acb); --To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 4 lines · ching
Hi Tomas,
Then I will have a patch 18/16 to replace
flush_scheduled_workwithflush_work. Thanks for your advice.
Here http://www.makelinux.net/ldd3/chp-7-sect-6 is a short text about workqueue, the use of schedule_work in your sources means that you use the global queue. If that is true, flush_scheduled_work is the right choice.
Quoted 73 lines · Tomas Henzl
Quoted 70 lines · ching
Quoted 37 lines
From: Ching<[email protected]>
This is a new patch after patch v1.1 series.
Fixed calling
scsi_scan_hostuntil all initialization are done. And fixed error path free allocated resource.Signed-off-by Ching<[email protected]>---
diff -uprN
a/drivers/scsi/arcmsr/arcmsr_hba.cb/drivers/scsi/arcmsr/arcmsr_hba.cdrivers/scsi/arcmsr/arcmsr_hba.c +2
-2@@ -112,6 +112,7 @@ static void arcmsr_hbaD_message_isr(strustatic void arcmsr_hardware_reset (struct AdapterControlBlock *acb);static const char *arcmsr_info (struct Scsi_Host *);static irqreturn_t arcmsr_interrupt (struct AdapterControlBlock *acb); +static void arcmsr_free_irq (struct pci_dev *,struct AdapterControlBlock *);static int arcmsr_adjust_disk_queue_depth (struct scsi_device *sdev,int queue_depth,int reason) {@@ -778,12 +779,11 @@ static int arcmsr_probe(struct pci_dev * } error =scsi_add_host (host, &pdev->dev);if (error){ - goto RAID_controller_stop; + goto free_ccb_pool; }if (arcmsr_request_irq (pdev, acb) ==ARC_FAILURE ) goto scsi_host_remove;arcmsr_iop_init (acb); -scsi_scan_host (host);INIT_WORK (&acb->arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);atomic_set (&acb->rq_map_token,16 );atomic_set (&acb->ante_token_value,16 );@@ -795,13 +795,17 @@ static int arcmsr_probe(struct pci_dev *add_timer (&acb->eternal_timer);drivers/scsi/arcmsr/arcmsr_hba.c static int arcmsr_probe(struct pci_dev * · line 802
Quoted 10 lines
drivers/scsi/arcmsr/arcmsr_hba.c +3
-3if (arcmsr_alloc_sysfs_attr (acb)) goto out_free_sysfs; +scsi_scan_host (host);return 0 ; out_free_sysfs: -scsi_host_remove: -scsi_remove_host (host); -RAID_controller_stop: +del_timer_sync (&acb->eternal_timer); +flush_work (&acb->arcmsr_do_message_isr_bh);In your driver you use both
flush_work(struct work_struct *)andflush_scheduled_work(), the second form is used used to flush the shared workqueue.
That said (and I think you use just one queue) you should decide which one is correct. In my previous mail I have asked aboutflush_workbecause i have it seen elsewhere in your code, now I've noticed the use ofschedule_workand that means that you are using the global wq.Quoted 15 lines
drivers/scsi/arcmsr/arcmsr_hba.c +4
-1arcmsr_stop_adapter_bgrb (acb);arcmsr_flush_adapter_cache (acb); +arcmsr_free_irq (pdev, acb); +scsi_host_remove: +scsi_remove_host (host); +free_ccb_pool:arcmsr_free_ccb_pool (acb); free_hbb_mu:arcmsr_free_mu (acb); --To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Tomas,
Although in http://www.makelinux.net/ldd3/chp-7-sect-6, there said to flush the shared workqueue requires calling function flush_scheduled_work.
But in kernel workqueue.c, there are comment of flush_scheduled_work said that
"In most situations flushing the entire workqueue is overkill; you merely need to know that a particular work item isn't queued and isn't running."
In such cases use flush_work is OK.
This can be proved in so many kernel device driver calling flush_work instead of flush_scheduled_work.
Quoted 84 lines · Tomas Henzl
Quoted 4 lines · ching
Hi Tomas,
Then I will have a patch 18/16 to replace
flush_scheduled_workwithflush_work. Thanks for your advice.Here http://www.makelinux.net/ldd3/chp-7-sect-6 is a short text about workqueue, the use of
schedule_workin your sources means that you use the global queue. If that is true,flush_scheduled_workis the right choice.Quoted 73 lines · Tomas Henzl
Quoted 70 lines · ching
Quoted 37 lines
From: Ching<[email protected]>
This is a new patch after patch v1.1 series.
Fixed calling
scsi_scan_hostuntil all initialization are done. And fixed error path free allocated resource.Signed-off-by Ching<[email protected]>---
diff -uprN
a/drivers/scsi/arcmsr/arcmsr_hba.cb/drivers/scsi/arcmsr/arcmsr_hba.cdrivers/scsi/arcmsr/arcmsr_hba.c +2
-2@@ -112,6 +112,7 @@ static void arcmsr_hbaD_message_isr(strustatic void arcmsr_hardware_reset (struct AdapterControlBlock *acb);static const char *arcmsr_info (struct Scsi_Host *);static irqreturn_t arcmsr_interrupt (struct AdapterControlBlock *acb); +static void arcmsr_free_irq (struct pci_dev *,struct AdapterControlBlock *);static int arcmsr_adjust_disk_queue_depth (struct scsi_device *sdev,int queue_depth,int reason) {@@ -778,12 +779,11 @@ static int arcmsr_probe(struct pci_dev * } error =scsi_add_host (host, &pdev->dev);if (error){ - goto RAID_controller_stop; + goto free_ccb_pool; }if (arcmsr_request_irq (pdev, acb) ==ARC_FAILURE ) goto scsi_host_remove;arcmsr_iop_init (acb); -scsi_scan_host (host);INIT_WORK (&acb->arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);atomic_set (&acb->rq_map_token,16 );atomic_set (&acb->ante_token_value,16 );@@ -795,13 +795,17 @@ static int arcmsr_probe(struct pci_dev *add_timer (&acb->eternal_timer);drivers/scsi/arcmsr/arcmsr_hba.c static int arcmsr_probe(struct pci_dev * · line 802
Quoted 10 lines
drivers/scsi/arcmsr/arcmsr_hba.c +3
-3if (arcmsr_alloc_sysfs_attr (acb)) goto out_free_sysfs; +scsi_scan_host (host);return 0 ; out_free_sysfs: -scsi_host_remove: -scsi_remove_host (host); -RAID_controller_stop: +del_timer_sync (&acb->eternal_timer); +flush_work (&acb->arcmsr_do_message_isr_bh);In your driver you use both
flush_work(struct work_struct *)andflush_scheduled_work(), the second form is used used to flush the shared workqueue.
That said (and I think you use just one queue) you should decide which one is correct. In my previous mail I have asked aboutflush_workbecause i have it seen elsewhere in your code, now I've noticed the use ofschedule_workand that means that you are using the global wq.Quoted 15 lines
drivers/scsi/arcmsr/arcmsr_hba.c +4
-1arcmsr_stop_adapter_bgrb (acb);arcmsr_flush_adapter_cache (acb); +arcmsr_free_irq (pdev, acb); +scsi_host_remove: +scsi_remove_host (host); +free_ccb_pool:arcmsr_free_ccb_pool (acb); free_hbb_mu:arcmsr_free_mu (acb); --To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 11 lines · ching
Hi Tomas,
Although in http://www.makelinux.net/ldd3/chp-7-sect-6, there said to flush the shared workqueue requires calling function
flush_scheduled_work.But in kernel
workqueue.c, there are comment offlush_scheduled_worksaid that
"In most situations flushing the entire workqueue is overkill; you merely need to know that a particular work item isn't queued and isn't running."In such cases use
flush_workis OK.
This can be proved in so many kernel device driver callingflush_workinstead offlush_scheduled_work.
Yes, I think now this is correct, I have no more objections.
Thanks, Tomas,
Quoted 88 lines · Tomas Henzl
Quoted 76 lines · ching
Quoted 4 lines
Hi Tomas,
Then I will have a patch 18/16 to replace
flush_scheduled_workwithflush_work. Thanks for your advice.Here http://www.makelinux.net/ldd3/chp-7-sect-6 is a short text about workqueue, the use of
schedule_workin your sources means that you use the global queue. If that is true,flush_scheduled_workis the right choice.Quoted 67 lines · Tomas Henzl
Quoted 66 lines · ching
Quoted 37 lines
From: Ching<[email protected]>
This is a new patch after patch v1.1 series.
Fixed calling
scsi_scan_hostuntil all initialization are done. And fixed error path free allocated resource.Signed-off-by Ching<[email protected]>---
diff -uprN
a/drivers/scsi/arcmsr/arcmsr_hba.cb/drivers/scsi/arcmsr/arcmsr_hba.cdrivers/scsi/arcmsr/arcmsr_hba.c +2
-2@@ -112,6 +112,7 @@ static void arcmsr_hbaD_message_isr(strustatic void arcmsr_hardware_reset (struct AdapterControlBlock *acb);static const char *arcmsr_info (struct Scsi_Host *);static irqreturn_t arcmsr_interrupt (struct AdapterControlBlock *acb); +static void arcmsr_free_irq (struct pci_dev *,struct AdapterControlBlock *);static int arcmsr_adjust_disk_queue_depth (struct scsi_device *sdev,int queue_depth,int reason) {@@ -778,12 +779,11 @@ static int arcmsr_probe(struct pci_dev * } error =scsi_add_host (host, &pdev->dev);if (error){ - goto RAID_controller_stop; + goto free_ccb_pool; }if (arcmsr_request_irq (pdev, acb) ==ARC_FAILURE ) goto scsi_host_remove;arcmsr_iop_init (acb); -scsi_scan_host (host);INIT_WORK (&acb->arcmsr_do_message_isr_bh, arcmsr_message_isr_bh_fn);atomic_set (&acb->rq_map_token,16 );atomic_set (&acb->ante_token_value,16 );@@ -795,13 +795,17 @@ static int arcmsr_probe(struct pci_dev *add_timer (&acb->eternal_timer);drivers/scsi/arcmsr/arcmsr_hba.c static int arcmsr_probe(struct pci_dev * · line 802
Quoted 10 lines
drivers/scsi/arcmsr/arcmsr_hba.c +3
-3if (arcmsr_alloc_sysfs_attr (acb)) goto out_free_sysfs; +scsi_scan_host (host);return 0 ; out_free_sysfs: -scsi_host_remove: -scsi_remove_host (host); -RAID_controller_stop: +del_timer_sync (&acb->eternal_timer); +flush_work (&acb->arcmsr_do_message_isr_bh);In your driver you use both
flush_work(struct work_struct *)andflush_scheduled_work(), the second form is used used to flush the shared workqueue.
That said (and I think you use just one queue) you should decide which one is correct. In my previous mail I have asked aboutflush_workbecause i have it seen elsewhere in your code, now I've noticed the use ofschedule_workand that means that you are using the global wq.Quoted 11 lines
drivers/scsi/arcmsr/arcmsr_hba.c +4
-0arcmsr_stop_adapter_bgrb (acb);arcmsr_flush_adapter_cache (acb); +arcmsr_free_irq (pdev, acb); +scsi_host_remove: +scsi_remove_host (host); +free_ccb_pool:arcmsr_free_ccb_pool (acb); free_hbb_mu:arcmsr_free_mu (acb);Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html