diff options
author | James.Smart@Emulex.Com <James.Smart@Emulex.Com> | 2005-11-29 16:32:13 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2005-12-13 20:34:14 -0500 |
commit | 875fbdfe9b1b4c8f12622a8d8d81428ff0984875 (patch) | |
tree | 63c787cb9a7d4a92eaedcc9f8a89a00d5d8f6603 /drivers/scsi/lpfc/lpfc.h | |
parent | 5cc36b3cd0e3610ad7c7e2514160998276798fc0 (diff) |
[SCSI] lpfc 8.1.1 : Add polled-mode support
- Add functionality to run in polled mode only. Includes run time
attribute to enable mode.
- Enable runtime writable hba settings for coallescing and delay parameters
Customers have requested a mode in the driver to run strictly polled.
This is generally to support an environment where the server is extremely
loaded and is looking to reclaim some cpu cycles from adapter interrupt
handling.
This patch adds a new "poll" attribute, and the following behavior:
if value is 0 (default):
The driver uses the normal method for i/o completion. It uses the
firmware feature of interrupt coalesing. The firmware allows a
minimum number of i/o completions before an interrupt, or a maximum
time delay between interrupts. By default, the driver sets these
to no delay (disabled) or 1 i/o - meaning coalescing is disabled.
Attributes were provided to change the coalescing values, but it was
a module-load time only and global across all adapters.
This patch allows them to be writable on a per-adapter basis.
if value is 1 :
Interrupts are left enabled, expecting that the user has tuned the
interrupt coalescing values. When this setting is enabled, the driver
will attempt to service completed i/o whenever new i/o is submitted
to the adapter. If the coalescing values are large, and the i/o
generation rate steady, an interrupt will be avoided by servicing
completed i/o prior to the coalescing thresholds kicking in. However,
if the i/o completion load is high enough or i/o generation slow, the
coalescion values will ensure that completed i/o is serviced in a timely
fashion.
if value is 3 :
Turns off FCP i/o interrupts altogether. The coalescing values now have
no effect. A new attribute "poll_tmo" (default 10ms) exists to set
the polling interval for i/o completion. When this setting is enabled,
the driver will attempt to service completed i/o and restart the
interval timer whenever new i/o is submitted. This behavior allows for
servicing of completed i/o sooner than the interval timer, but ensures
that if no i/o is being issued, then the interval timer will kick in
to service the outstanding i/o.
Signed-off-by: James Smart <James.Smart@emulex.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc.h')
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index dc73a2f8f12c..1f3873ae9d68 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -45,6 +45,11 @@ struct lpfc_sli2_slim; | |||
45 | 45 | ||
46 | #define MAX_HBAEVT 32 | 46 | #define MAX_HBAEVT 32 |
47 | 47 | ||
48 | enum lpfc_polling_flags { | ||
49 | ENABLE_FCP_RING_POLLING = 0x1, | ||
50 | DISABLE_FCP_RING_INT = 0x2 | ||
51 | }; | ||
52 | |||
48 | /* Provide DMA memory definitions the driver uses per port instance. */ | 53 | /* Provide DMA memory definitions the driver uses per port instance. */ |
49 | struct lpfc_dmabuf { | 54 | struct lpfc_dmabuf { |
50 | struct list_head list; | 55 | struct list_head list; |
@@ -287,6 +292,8 @@ struct lpfc_hba { | |||
287 | uint32_t cfg_fcp_bind_method; | 292 | uint32_t cfg_fcp_bind_method; |
288 | uint32_t cfg_discovery_threads; | 293 | uint32_t cfg_discovery_threads; |
289 | uint32_t cfg_max_luns; | 294 | uint32_t cfg_max_luns; |
295 | uint32_t cfg_poll; | ||
296 | uint32_t cfg_poll_tmo; | ||
290 | uint32_t cfg_sg_seg_cnt; | 297 | uint32_t cfg_sg_seg_cnt; |
291 | uint32_t cfg_sg_dma_buf_size; | 298 | uint32_t cfg_sg_dma_buf_size; |
292 | 299 | ||
@@ -338,7 +345,9 @@ struct lpfc_hba { | |||
338 | #define VPD_PORT 0x8 /* valid vpd port data */ | 345 | #define VPD_PORT 0x8 /* valid vpd port data */ |
339 | #define VPD_MASK 0xf /* mask for any vpd data */ | 346 | #define VPD_MASK 0xf /* mask for any vpd data */ |
340 | 347 | ||
348 | struct timer_list fcp_poll_timer; | ||
341 | struct timer_list els_tmofunc; | 349 | struct timer_list els_tmofunc; |
350 | |||
342 | /* | 351 | /* |
343 | * stat counters | 352 | * stat counters |
344 | */ | 353 | */ |
@@ -349,6 +358,7 @@ struct lpfc_hba { | |||
349 | struct lpfc_sysfs_mbox sysfs_mbox; | 358 | struct lpfc_sysfs_mbox sysfs_mbox; |
350 | 359 | ||
351 | /* fastpath list. */ | 360 | /* fastpath list. */ |
361 | spinlock_t scsi_buf_list_lock; | ||
352 | struct list_head lpfc_scsi_buf_list; | 362 | struct list_head lpfc_scsi_buf_list; |
353 | uint32_t total_scsi_bufs; | 363 | uint32_t total_scsi_bufs; |
354 | struct list_head lpfc_iocb_list; | 364 | struct list_head lpfc_iocb_list; |