Skip to contentSkip to conversation

aacraid: Patchset for aacraid driver version 41052

PATCH Superseded Raghava Aditya Renukunta 4 participants 15 messages Jan 29, 2016 – Feb 2, 2016

Subsystems (2)

v4 of 6 Superseded Latest is v6 →

lore
Share & tools
lore
#0 lore raw

v4 cover aacraid: Patchset for aacraid driver version 41052

This patchset includes the following changes (bug fixes and new feature support) specific to aacraid driver.

V2:
Removed aac_fib_free_tag function
Setup relevant fib variables only once
Created aac_fib_vector_assign function
Made EEH functions static
Added character device status macros
changed location of aac->shutdown to prevent race condition Withdrew patch that disables device ID wild card binding Added Reviewed-by, Cc and Fixes tags from mailing list

V3:
Moved aac_send_shutdown to top of __aac_shutdown
Converted aac->adapter_shutdown to atomic

V4:
Reverted adapter_shutdown from atomic
Used mutex to prevent shutdown race conditions on ioctl path

Raghava Aditya Renukunta (9):
[SCSI] aacraid: SCSI blk tag support
[SCSI] aacraid: Fix RRQ overload
[SCSI] aacraid: Added EEH support
[SCSI] aacraid: Fix memory leak in aac_fib_map_free [SCSI] aacraid: Set correct msix count for EEH recovery [SCSI] aacraid: Fundamental reset support for Series 7 [SCSI] aacraid: Fix AIF triggered IOP_RESET [SCSI] aacraid: Fix character device re-initialization [SCSI] aacraid: Update driver version

 drivers/scsi/aacraid/aachba.c   |  27 ++---
 drivers/scsi/aacraid/aacraid.h  |  15 ++-
 drivers/scsi/aacraid/commctrl.c |   3 +
 drivers/scsi/aacraid/comminit.c |   6 +-
 drivers/scsi/aacraid/commsup.c  |  69 +++++++++++-
 drivers/scsi/aacraid/dpcsup.c   |   2 -
 drivers/scsi/aacraid/linit.c    | 241 ++++++++++++++++++++++++++++++++++++----
 drivers/scsi/aacraid/src.c      |  30 ++---
 8 files changed, 320 insertions(+), 73 deletions(-)
Signature · 1 line
1.9.1
#1 lore raw

PATCH v4 1/9 aacraid: SCSI blk tag support

From: Raghava Aditya Renukunta <[email protected]>

The method to allocate and free FIB's in the present code utilizes spinlocks.Multiple IO's have to wait on the spinlock to acquire or free fibs creating a performance bottleneck.

An alternative solution would be to use block layer tags to keep track of the fibs allocated and freed. To this end aac_fib_alloc_tag was created to utilize the blk layer tags to plug into the Fib pool.These functions are used exclusively in the IO path. 8 fibs are reserved for the use of AIF management software and utilize the previous spinlock based implementations.

Changes in V2:
Removed aac_fib_free_tag since it was a stub function Moved population of fib fields that are constant to aac_fib_setup

Changes in V3:
None

Changes in V4:
None

---
 drivers/scsi/aacraid/aachba.c  | 27 ++++++++++++---------------
 drivers/scsi/aacraid/aacraid.h |  1 +
 drivers/scsi/aacraid/commsup.c | 32 +++++++++++++++++++++++++++++---
 drivers/scsi/aacraid/dpcsup.c  |  2 --
 drivers/scsi/aacraid/linit.c   |  2 ++
 5 files changed, 44 insertions(+), 20 deletions(-)
drivers/scsi/aacraid/aachba.c +12 -15
index e4c2437..7dfd0fa 100644
@@ -323,7 +323,6 @@ static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
 	if (unlikely(!scsicmd || !scsicmd->scsi_done)) {
 		dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n"));
 		aac_fib_complete(fibptr);
-		aac_fib_free(fibptr);
 		return 0;
 	}
 	scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
@@ -331,7 +330,6 @@ static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
 	if (unlikely(!device || !scsi_device_online(device))) {
 		dprintk((KERN_WARNING "aac_valid_context: scsi device corrupt\n"));
 		aac_fib_complete(fibptr);
-		aac_fib_free(fibptr);
 		return 0;
 	}
 	return 1;
@@ -541,7 +539,6 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
 	scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
 	aac_fib_complete(fibptr);
-	aac_fib_free(fibptr);
 	scsicmd->scsi_done(scsicmd);
 }
 
@@ -557,7 +554,8 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
 
 	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
-	if (!(cmd_fibcontext = aac_fib_alloc(dev)))
+	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+	if (!cmd_fibcontext)
 		return -ENOMEM;
 
 	aac_fib_init(cmd_fibcontext);
@@ -586,7 +584,6 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd)
 
 	printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
 	aac_fib_complete(cmd_fibcontext);
-	aac_fib_free(cmd_fibcontext);
 	return -1;
 }
 
@@ -1024,7 +1021,6 @@ static void get_container_serial_callback(void *context, struct fib * fibptr)
 	scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
 
 	aac_fib_complete(fibptr);
-	aac_fib_free(fibptr);
 	scsicmd->scsi_done(scsicmd);
 }
 
@@ -1040,7 +1036,8 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
 
 	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
 
-	if (!(cmd_fibcontext = aac_fib_alloc(dev)))
+	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+	if (!cmd_fibcontext)
 		return -ENOMEM;
 
 	aac_fib_init(cmd_fibcontext);
@@ -1068,7 +1065,6 @@ static int aac_get_container_serial(struct scsi_cmnd * scsicmd)
 
 	printk(KERN_WARNING "aac_get_container_serial: aac_fib_send failed with status: %d.\n", status);
 	aac_fib_complete(cmd_fibcontext);
-	aac_fib_free(cmd_fibcontext);
 	return -1;
 }
 
@@ -1869,7 +1865,6 @@ static void io_callback(void *context, struct fib * fibptr)
 		break;
 	}
 	aac_fib_complete(fibptr);
-	aac_fib_free(fibptr);
 
 	scsicmd->scsi_done(scsicmd);
 }
@@ -1954,7 +1949,8 @@ static int aac_read(struct scsi_cmnd * scsicmd)
 	/*
 	 *	Alocate and initialize a Fib
 	 */
-	if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
+	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+	if (!cmd_fibcontext) {
 		printk(KERN_WARNING "aac_read: fib allocation failed\n");
 		return -1;
 	}
@@ -2051,7 +2047,8 @@ static int aac_write(struct scsi_cmnd * scsicmd)
 	/*
 	 *	Allocate and initialize a Fib then setup a BlockWrite command
 	 */
-	if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
+	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+	if (!cmd_fibcontext) {
 		/* FIB temporarily unavailable,not catastrophic failure */
 
 		/* scsicmd->result = DID_ERROR << 16;
@@ -2285,7 +2282,7 @@ static int aac_start_stop(struct scsi_cmnd *scsicmd)
 	/*
 	 *	Allocate and initialize a Fib
 	 */
-	cmd_fibcontext = aac_fib_alloc(aac);
+	cmd_fibcontext = aac_fib_alloc_tag(aac, scsicmd);
 	if (!cmd_fibcontext)
 		return SCSI_MLQUEUE_HOST_BUSY;
 
@@ -3157,7 +3154,6 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
 	scsicmd->result |= le32_to_cpu(srbreply->scsi_status);
 
 	aac_fib_complete(fibptr);
-	aac_fib_free(fibptr);
 	scsicmd->scsi_done(scsicmd);
 }
 
@@ -3187,9 +3183,10 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
 	/*
 	 *	Allocate and initialize a Fib then setup a BlockWrite command
 	 */
-	if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
+	cmd_fibcontext = aac_fib_alloc_tag(dev, scsicmd);
+	if (!cmd_fibcontext)
 		return -1;
-	}
+
 	status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
 
 	/*
drivers/scsi/aacraid/aacraid.h +1 -0
index 074878b..f51f0a0 100644
@@ -2114,6 +2114,7 @@ int aac_acquire_irq(struct aac_dev *dev);
 void aac_free_irq(struct aac_dev *dev);
 const char *aac_driverinfo(struct Scsi_Host *);
 struct fib *aac_fib_alloc(struct aac_dev *dev);
+struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd);
 int aac_fib_setup(struct aac_dev *dev);
 void aac_fib_map_free(struct aac_dev *dev);
 void aac_fib_free(struct fib * context);
drivers/scsi/aacraid/commsup.c +29 -3
index a1f90fe..46a2a2f 100644
@@ -137,6 +137,7 @@ int aac_fib_setup(struct aac_dev * dev)
 		i++, fibptr++)
 	{
 		fibptr->flags = 0;
+		fibptr->size = sizeof(struct fib);
 		fibptr->dev = dev;
 		fibptr->hw_fib_va = hw_fib;
 		fibptr->data = (void *) fibptr->hw_fib_va->data;
@@ -156,13 +157,38 @@ int aac_fib_setup(struct aac_dev * dev)
 	 */
 	dev->fibs[dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1].next = NULL;
 	/*
-	 *	Enable this to debug out of queue space
-	 */
-	dev->free_fib = &dev->fibs[0];
+	*	Set 8 fibs aside for management tools
+	*/
+	dev->free_fib = &dev->fibs[dev->scsi_host_ptr->can_queue];
 	return 0;
 }
 
 /**
+ *	aac_fib_alloc_tag-allocate a fib using tags
+ *	@dev: Adapter to allocate the fib for
+ *
+ *	Allocate a fib from the adapter fib pool using tags
+ *	from the blk layer.
+ */
+
+struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd)
+{
+	struct fib *fibptr;
+
+	fibptr = &dev->fibs[scmd->request->tag];
+	/*
+	 *	Null out fields that depend on being zero at the start of
+	 *	each I/O
+	 */
+	fibptr->hw_fib_va->header.XferState = 0;
+	fibptr->type = FSAFS_NTC_FIB_CONTEXT;
+	fibptr->callback_data = NULL;
+	fibptr->callback = NULL;
+
+	return fibptr;
+}
+
+/**
  *	aac_fib_alloc	-	allocate a fib
  *	@dev: Adapter to allocate the fib for
  *
drivers/scsi/aacraid/dpcsup.c +0 -2
index da9d993..d677b52 100644
@@ -394,7 +394,6 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index,
 				fib->callback(fib->callback_data, fib);
 			} else {
 				aac_fib_complete(fib);
-				aac_fib_free(fib);
 			}
 		} else {
 			unsigned long flagv;
@@ -416,7 +415,6 @@ unsigned int aac_intr_normal(struct aac_dev *dev, u32 index,
 				fib->done = 0;
 				spin_unlock_irqrestore(&fib->event_lock, flagv);
 				aac_fib_complete(fib);
-				aac_fib_free(fib);
 			}
 
 		}
drivers/scsi/aacraid/linit.c +2 -0
index 76eaa38..129a515 100644
@@ -454,6 +454,8 @@ static int aac_slave_configure(struct scsi_device *sdev)
 	} else
 		scsi_change_queue_depth(sdev, 1);
 
+		sdev->tagged_supported = 1;
+
 	return 0;
 }
 
Signature · 1 line
1.9.1
#2 lore raw

PATCH v4 2/9 aacraid: Fix RRQ overload

In reply to Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

The driver utilizes an array of atomic variables to keep track of IO submissions to each vector. To submit an IO multiple threads iterate through the array to find a vector which has empty slots to send an IO. The reading and updating of the variable is not atomic, causing race conditions when a thread uses a full vector to submit an IO.

Fixed by mapping each FIB to a vector, the submission path then uses said vector to submit IO thereby removing the possibly of a race condition.The vector assignment is started from 1 since vector 0 is reserved for the use of AIF management FIBS.If the number of MSIx vectors is 1 (MSI or INTx mode) then all the fibs are allocated to vector 0.

Changes in V2:
Created function aac_fib_vector_assign to assign vector numbers to fib and to prevent code duplication

Changes in V3:
None

Changes in V4:
None

Fixes 495c0217 "aacraid: MSI-x support"
---
 drivers/scsi/aacraid/aacraid.h |  2 ++
 drivers/scsi/aacraid/commsup.c | 28 ++++++++++++++++++++++++++++
 drivers/scsi/aacraid/src.c     | 30 +++++++-----------------------
 3 files changed, 37 insertions(+), 23 deletions(-)
drivers/scsi/aacraid/aacraid.h +2 -0
index f51f0a0..fff1306 100644
@@ -944,6 +944,7 @@ struct fib {
 	 */
 	struct list_head	fiblink;
 	void			*data;
+	u32			vector_no;
 	struct hw_fib		*hw_fib_va;		/* Actual shared object */
 	dma_addr_t		hw_fib_pa;		/* physical address of hw_fib*/
 };
@@ -2113,6 +2114,7 @@ static inline unsigned int cap_to_cyls(sector_t capacity, unsigned divisor)
 int aac_acquire_irq(struct aac_dev *dev);
 void aac_free_irq(struct aac_dev *dev);
 const char *aac_driverinfo(struct Scsi_Host *);
+void aac_fib_vector_assign(struct aac_dev *dev);
 struct fib *aac_fib_alloc(struct aac_dev *dev);
 struct fib *aac_fib_alloc_tag(struct aac_dev *dev, struct scsi_cmnd *scmd);
 int aac_fib_setup(struct aac_dev *dev);
drivers/scsi/aacraid/commsup.c +28 -0
index 46a2a2f..07a42a3 100644
@@ -90,6 +90,28 @@ void aac_fib_map_free(struct aac_dev *dev)
 	dev->hw_fib_pa = 0;
 }
 
+void aac_fib_vector_assign(struct aac_dev *dev)
+{
+	u32 i = 0;
+	u32 vector = 1;
+	struct fib *fibptr = NULL;
+
+	for (i = 0, fibptr = &dev->fibs[i];
+		i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB);
+		i++, fibptr++) {
+		if ((dev->max_msix == 1) ||
+		  (i > ((dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1)
+			- dev->vector_cap))) {
+			fibptr->vector_no = 0;
+		} else {
+			fibptr->vector_no = vector;
+			vector++;
+			if (vector == dev->max_msix)
+				vector = 1;
+		}
+	}
+}
+
 /**
  *	aac_fib_setup	-	setup the fibs
  *	@dev: Adapter to set up
@@ -152,6 +174,12 @@ int aac_fib_setup(struct aac_dev * dev)
 		hw_fib_pa = hw_fib_pa +
 			dev->max_fib_size + sizeof(struct aac_fib_xporthdr);
 	}
+
+	/*
+	 *Assign vector numbers to fibs
+	 */
+	aac_fib_vector_assign(dev);
+
 	/*
 	 *	Add the fib chain to the free list
 	 */
drivers/scsi/aacraid/src.c +7 -23
index 2aa34ea..bc0203f 100644
@@ -156,8 +156,8 @@ static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
 				break;
 			if (dev->msi_enabled && dev->max_msix > 1)
 				atomic_dec(&dev->rrq_outstanding[vector_no]);
-			aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL);
 			dev->host_rrq[index++] = 0;
+			aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL);
 			if (index == (vector_no + 1) * dev->vector_cap)
 				index = vector_no * dev->vector_cap;
 			dev->host_rrq_idx[vector_no] = index;
@@ -452,36 +452,20 @@ static int aac_src_deliver_message(struct fib *fib)
 #endif
 
 	u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
+	u16 vector_no;
 
 	atomic_inc(&q->numpending);
 
 	if (dev->msi_enabled && fib->hw_fib_va->header.Command != AifRequest &&
 	    dev->max_msix > 1) {
-		u_int16_t vector_no, first_choice = 0xffff;
-
-		vector_no = dev->fibs_pushed_no % dev->max_msix;
-		do {
-			vector_no += 1;
-			if (vector_no == dev->max_msix)
-				vector_no = 1;
-			if (atomic_read(&dev->rrq_outstanding[vector_no]) <
-			    dev->vector_cap)
-				break;
-			if (0xffff == first_choice)
-				first_choice = vector_no;
-			else if (vector_no == first_choice)
-				break;
-		} while (1);
-		if (vector_no == first_choice)
-			vector_no = 0;
-		atomic_inc(&dev->rrq_outstanding[vector_no]);
-		if (dev->fibs_pushed_no == 0xffffffff)
-			dev->fibs_pushed_no = 0;
-		else
-			dev->fibs_pushed_no++;
+		vector_no = fib->vector_no;
 		fib->hw_fib_va->header.Handle += (vector_no << 16);
+	} else {
+		vector_no = 0;
 	}
 
+	atomic_inc(&dev->rrq_outstanding[vector_no]);
+
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) {
 		/* Calculate the amount to the fibsize bits */
 		fibsize = (hdr_size + 127) / 128 - 1;
Signature · 1 line
1.9.1
#3 lore raw

PATCH v4 3/9 aacraid: Added EEH support

In reply to Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

Added support for PCI EEH(extended error handling).

Changes in V2:
Made local functions static
Removed call to aac_fib_free_tag
Set adapter_shutdown flag when PCI error detected

Changes in V3:
None

Changes in V4:
Removed setting of adapter_shutdown flag when \
PCI error detected

---
 drivers/scsi/aacraid/aacraid.h |   1 +
 drivers/scsi/aacraid/linit.c   | 137 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 138 insertions(+)
drivers/scsi/aacraid/aacraid.h +1 -0
index fff1306..2916288 100644
@@ -1235,6 +1235,7 @@ struct aac_dev
 	struct msix_entry	msixentry[AAC_MAX_MSIX];
 	struct aac_msix_ctx	aac_msix[AAC_MAX_MSIX]; /* context */
 	u8			adapter_shutdown;
+	u32			handle_pci_error;
 };
 
 #define aac_adapter_interrupt(dev) \
drivers/scsi/aacraid/linit.c +137 -0

161 lines not on this page · raw message

Signature · 1 line
1.9.1
#4 lore raw

Re: [PATCH V4 3/9] aacraid: Added EEH support

reproduce: wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree…

Hi Raghava,

[auto build test ERROR on scsi/for-next]
[also build test ERROR on v4.5-rc1 next-20160129]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]

url:    https://github.com/0day-ci/linux/commits/Raghava-Aditya-Renukunta/aacraid-Patchset-for-aacraid-driver-version-41052/20160130-064140
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi.git for-next
config: tile-allmodconfig (attached as .config)

reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=tile

All errors (new ones prefixed by >>):

drivers/scsi/aacraid/linit.c: In function 'aac_pci_error_detected':

>> drivers/scsi/aacraid/linit.c:1544:3: error: implicit declaration of function 'aac_release_resources'
   drivers/scsi/aacraid/linit.c: In function 'aac_pci_resume':
>> drivers/scsi/aacraid/linit.c:1614:2: error: implicit declaration of function 'aac_acquire_resources'

cc1: some warnings being treated as errors

vim +/aac_release_resources +1544 drivers/scsi/aacraid/linit.c

1538 return PCI_ERS_RESULT_CAN_RECOVER;
1539 case pci_channel_io_frozen:
1540 aac->handle_pci_error = 1;
1541
1542 scsi_block_requests(aac->scsi_host_ptr);
1543 aac_flush_ios(aac);

> 1544			aac_release_resources(aac);
  1545	
  1546			pci_disable_pcie_error_reporting(pdev);
  1547			aac_adapter_ioremap(aac, 0);
  1548	
  1549			return PCI_ERS_RESULT_NEED_RESET;
  1550		case pci_channel_io_perm_failure:
  1551			aac->handle_pci_error = 1;
  1552	
  1553			aac_flush_ios(aac);
  1554			return PCI_ERS_RESULT_DISCONNECT;
  1555		}
  1556	
  1557		return PCI_ERS_RESULT_NEED_RESET;
  1558	}
  1559	
  1560	static pci_ers_result_t aac_pci_mmio_enabled(struct pci_dev *pdev)
  1561	{
  1562		dev_err(&pdev->dev, "aacraid: PCI error - mmio enabled\n");
  1563		return PCI_ERS_RESULT_NEED_RESET;
  1564	}
  1565	
  1566	static pci_ers_result_t aac_pci_slot_reset(struct pci_dev *pdev)
  1567	{
  1568		dev_err(&pdev->dev, "aacraid: PCI error - slot reset\n");
  1569		pci_restore_state(pdev);
  1570		if (pci_enable_device(pdev)) {
  1571			dev_warn(&pdev->dev,
  1572				"aacraid: failed to enable slave\n");
  1573			goto fail_device;
  1574		}
  1575	
  1576		pci_set_master(pdev);
  1577	
  1578		if (pci_enable_device_mem(pdev)) {
  1579			dev_err(&pdev->dev, "pci_enable_device_mem failed\n");
  1580			goto fail_device;
  1581		}
  1582	
  1583		return PCI_ERS_RESULT_RECOVERED;
  1584	
  1585	fail_device:
  1586		dev_err(&pdev->dev, "aacraid: PCI error - slot reset failed\n");
  1587		return PCI_ERS_RESULT_DISCONNECT;
  1588	}
  1589	
  1590	
  1591	static void aac_pci_resume(struct pci_dev *pdev)
  1592	{
  1593		struct Scsi_Host *shost = pci_get_drvdata(pdev);
  1594		struct scsi_device *sdev = NULL;
  1595		struct aac_dev *aac = (struct aac_dev *)shost_priv(shost);
  1596	
  1597		pci_cleanup_aer_uncorrect_error_status(pdev);
  1598	
  1599		if (aac_adapter_ioremap(aac, aac->base_size)) {
  1600	
  1601			dev_err(&pdev->dev, "aacraid: ioremap failed\n");
  1602			/* remap failed, go back ... */
  1603			aac->comm_interface = AAC_COMM_PRODUCER;
  1604			if (aac_adapter_ioremap(aac, AAC_MIN_FOOTPRINT_SIZE)) {
  1605				dev_warn(&pdev->dev,
  1606					"aacraid: unable to map adapter.\n");
  1607	
  1608				return;
  1609			}
  1610		}
  1611	
  1612		msleep(10000);
  1613	
> 1614		aac_acquire_resources(aac);

1615
1616 /*
1617 * reset this flag to unblock ioctl() as it was set

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

#5 lore raw

PATCH v4 4/9 aacraid: Fix memory leak in aac_fib_map_free

In reply to Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

aac_fib_map_free() calls pci_free_consistent() without checking that dev->hw_fib_va is not NULL and dev->max_fib_size is not zero.If they are indeed NULL/0, this will result in a hang as pci_free_consistent() will attempt to invalidate cache for the entire 64-bit address space (which would take a very long time).

Fixed by adding a check to make sure that dev->hw_fib_va and dev->max_fib_size are not NULL and 0 respectively.

Changes in V2:
None

Changes in V3:
None

Changes in V4:
None

Fixes 9ad5204d6 - "[SCSI]aacraid: incorrect dma mapping mask

during blinked recover or user initiated reset"
Cc: [email protected]

---
 drivers/scsi/aacraid/commsup.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/scsi/aacraid/commsup.c +6 -3
index 07a42a3..511bbc5 100644
@@ -83,9 +83,12 @@ static int fib_map_alloc(struct aac_dev *dev)
 
 void aac_fib_map_free(struct aac_dev *dev)
 {
-	pci_free_consistent(dev->pdev,
-	  dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB),
-	  dev->hw_fib_va, dev->hw_fib_pa);
+	if (dev->hw_fib_va && dev->max_fib_size) {
+		pci_free_consistent(dev->pdev,
+		(dev->max_fib_size *
+		(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB)),
+		dev->hw_fib_va, dev->hw_fib_pa);
+	}
 	dev->hw_fib_va = NULL;
 	dev->hw_fib_pa = 0;
 }
Signature · 1 line
1.9.1
#6 lore raw

PATCH v4 5/9 aacraid: Set correct msix count for EEH recovery

In reply to Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

During EEH recovery number of online CPU's might change thereby changing the number of MSIx vectors. Since each fib is allocated to a vector, changes in the number of vectors causes fib to be sent thru invalid vectors.In addition the correct number of MSIx vectors is not updated in the INIT struct sent to the controller, when it is reinitialized.

Fixed by reassigning vectors to fibs based on the updated number of MSIx vectors and updating the INIT structure before sending to controller.

Changes in V2:
Replaced fib vector allocation code with aac_fib_vector_assign

Changes in V3:
None

Changes in V4:
None

Fixes MSI-X vector calculation for suspend/resume
---
 drivers/scsi/aacraid/linit.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/scsi/aacraid/linit.c +11 -1
index 62ac7be..4bc4503 100644
@@ -1410,8 +1410,18 @@ static int aac_acquire_resources(struct aac_dev *dev)
 
 	aac_adapter_enable_int(dev);
 
-	if (!dev->sync_mode)
+	/*max msix may change  after EEH
+	 * Re-assign vectors to fibs
+	 */
+	aac_fib_vector_assign(dev);
+
+	if (!dev->sync_mode) {
+		/* After EEH recovery or suspend resume, max_msix count
+		 * may change, therfore updating in init as well.
+		 */
 		aac_adapter_start(dev);
+		dev->init->Sa_MSIXVectors = cpu_to_le32(dev->max_msix);
+	}
 	return 0;
 
 error_iounmap:
Signature · 1 line
1.9.1
#7 lore raw

PATCH v4 6/9 aacraid: Fundamental reset support for Series 7

In reply to Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

Series 7 does not support PCI hot reset used by EEH.

Enabled fundamental reset only for Series 7

Changes in V2:
None

Changes in V3:
None

Changes in V4:
None

---
 drivers/scsi/aacraid/linit.c | 6 ++++++
 1 file changed, 6 insertions(+)
drivers/scsi/aacraid/linit.c +6 -0
index 4bc4503..af8974e 100644
@@ -1135,6 +1135,12 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 	u64 dmamask;
 	extern int aac_sync_mode;
 
+	/*
+	 * Only series 7 needs freset.
+	 */
+	 if (pdev->device == PMC_DEVICE_S7)
+		pdev->needs_freset = 1;
+
 	list_for_each_entry(aac, &aac_devices, entry) {
 		if (aac->id > unique_id)
 			break;
Signature · 1 line
1.9.1
#8 lore raw

PATCH v4 7/9 aacraid: Fix AIF triggered IOP_RESET

In reply to Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

while driver removal is in progress or PCI shutdown is invoked, driver kills AIF aacraid thread, but IOCTL requests from the management tools re-start AIF thread leading to IOP_RESET.

Fixed by setting adapter_shutdown flag when PCI shutdown is invoked.

Changes in V2:
Set adapter_shutdown flag before shutdown command is sent to \
controller

Changes in V3:
Call aac_send_shut_shutdown first thing in __aac_shutdown Convert adapter_shutdown to atomic_t variable to prevent \
SMP coherency issues(race conditions)

Changes in V4:
Used mutex to protect ioctl path and adapter_shutdown to prevent \
race conditions.

---
 drivers/scsi/aacraid/aacraid.h  |  2 +-
 drivers/scsi/aacraid/commctrl.c |  3 ++
 drivers/scsi/aacraid/comminit.c |  6 ++--
 drivers/scsi/aacraid/linit.c    | 63 +++++++++++++++++++++++++++++++----------
 4 files changed, 56 insertions(+), 18 deletions(-)
drivers/scsi/aacraid/aacraid.h +1 -1
index 2916288..6c55749 100644
@@ -1123,7 +1123,7 @@ struct aac_dev
 
 	struct fib		*free_fib;
 	spinlock_t		fib_lock;
-
+	struct mutex		ioctl_mutex;
 	struct aac_queue_block *queues;
 	/*
 	 *	The user API will use an IOCTL to register itself to receive
drivers/scsi/aacraid/commctrl.c +3 -0
index 54195a1..8d3438c 100644
@@ -855,6 +855,9 @@ int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
 {
 	int status;
 
+	if (dev->adapter_shutdown)
+		return -EACCES;
+
 	/*
 	 *	HBA gets first crack
 	 */
drivers/scsi/aacraid/comminit.c +4 -2
index 0e954e3..2b4e753 100644
@@ -212,8 +212,11 @@ int aac_send_shutdown(struct aac_dev * dev)
 		return -ENOMEM;
 	aac_fib_init(fibctx);
 
-	cmd = (struct aac_close *) fib_data(fibctx);
+	mutex_lock(&dev->ioctl_mutex);
+	dev->adapter_shutdown = 1;
+	mutex_unlock(&dev->ioctl_mutex);
 
+	cmd = (struct aac_close *) fib_data(fibctx);
 	cmd->command = cpu_to_le32(VM_CloseAll);
 	cmd->cid = cpu_to_le32(0xfffffffe);
 
@@ -229,7 +232,6 @@ int aac_send_shutdown(struct aac_dev * dev)
 	/* FIB should be freed only after getting the response from the F/W */
 	if (status != -ERESTARTSYS)
 		aac_fib_free(fibctx);
-	dev->adapter_shutdown = 1;
 	if ((dev->pdev->device == PMC_DEVICE_S7 ||
 	     dev->pdev->device == PMC_DEVICE_S8 ||
 	     dev->pdev->device == PMC_DEVICE_S9) &&
drivers/scsi/aacraid/linit.c +48 -15

135 lines not on this page · raw message

Signature · 1 line
1.9.1
Reviewed-by on v4 7/9
#9 lore raw

Re: [PATCH V4 7/9] aacraid: Fix AIF triggered IOP_RESET

Quoted 129 lines · Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

while driver removal is in progress or PCI shutdown is invoked, driver kills AIF aacraid thread, but IOCTL requests from the management tools re-start AIF thread leading to IOP_RESET.

Fixed by setting adapter_shutdown flag when PCI shutdown is invoked.

Changes in V2:
Set adapter_shutdown flag before shutdown command is sent to \
controller

Changes in V3:
Call aac_send_shut_shutdown first thing in __aac_shutdown Convert adapter_shutdown to atomic_t variable to prevent \
SMP coherency issues(race conditions)

Changes in V4:
Used mutex to protect ioctl path and adapter_shutdown to prevent \
race conditions.

---
 drivers/scsi/aacraid/aacraid.h  |  2 +-
 drivers/scsi/aacraid/commctrl.c |  3 ++
 drivers/scsi/aacraid/comminit.c |  6 ++--
 drivers/scsi/aacraid/linit.c    | 63 +++++++++++++++++++++++++++++++----------
 4 files changed, 56 insertions(+), 18 deletions(-)
drivers/scsi/aacraid/aacraid.h +1 -1
index 2916288..6c55749 100644
@@ -1123,7 +1123,7 @@ struct aac_dev
 
 	struct fib		*free_fib;
 	spinlock_t		fib_lock;
-
+	struct mutex		ioctl_mutex;
 	struct aac_queue_block *queues;
 	/*
 	 *	The user API will use an IOCTL to register itself to receive
drivers/scsi/aacraid/commctrl.c +3 -0
index 54195a1..8d3438c 100644
@@ -855,6 +855,9 @@ int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
 {
 	int status;
 
+	if (dev->adapter_shutdown)
+		return -EACCES;
+
 	/*
 	 *	HBA gets first crack
 	 */
drivers/scsi/aacraid/comminit.c +4 -2
index 0e954e3..2b4e753 100644
@@ -212,8 +212,11 @@ int aac_send_shutdown(struct aac_dev * dev)
 		return -ENOMEM;
 	aac_fib_init(fibctx);
 
-	cmd = (struct aac_close *) fib_data(fibctx);
+	mutex_lock(&dev->ioctl_mutex);
+	dev->adapter_shutdown = 1;
+	mutex_unlock(&dev->ioctl_mutex);
 
+	cmd = (struct aac_close *) fib_data(fibctx);
 	cmd->command = cpu_to_le32(VM_CloseAll);
 	cmd->cid = cpu_to_le32(0xfffffffe);
 
@@ -229,7 +232,6 @@ int aac_send_shutdown(struct aac_dev * dev)
 	/* FIB should be freed only after getting the response from the F/W */
 	if (status != -ERESTARTSYS)
 		aac_fib_free(fibctx);
-	dev->adapter_shutdown = 1;
 	if ((dev->pdev->device == PMC_DEVICE_S7 ||
 	     dev->pdev->device == PMC_DEVICE_S8 ||
 	     dev->pdev->device == PMC_DEVICE_S9) &&
drivers/scsi/aacraid/linit.c +16 -8
index af8974e..9453e11 100644
@@ -524,10 +524,17 @@ static struct device_attribute *aac_dev_attrs[] = {
 
 static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg)
 {
-	struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
+	int ret;
+	struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
+
 	if (!capable(CAP_SYS_RAWIO))
 		return -EPERM;
-	return aac_do_ioctl(dev, cmd, arg);
+
+	mutex_lock(&aac->ioctl_mutex);
+	ret = aac_do_ioctl(aac, cmd, arg);
+	mutex_unlock(&aac->ioctl_mutex);
+
+	return ret;
 }
 
 static int aac_eh_abort(struct scsi_cmnd* cmd)
@@ -704,13 +711,14 @@ static long aac_cfg_ioctl(struct file *file,
 		unsigned int cmd, unsigned long arg)
 {
 	int ret;
-	struct aac_dev *aac;
-	aac = (struct aac_dev *)file->private_data;
-	if (!capable(CAP_SYS_RAWIO) || aac->adapter_shutdown)
+	struct aac_dev *aac = (struct aac_dev *)file->private_data;
+
+	if (!capable(CAP_SYS_RAWIO))
 		return -EPERM;
-	mutex_lock(&aac_mutex);
-	ret = aac_do_ioctl(file->private_data, cmd, (void __user *)arg);
-	mutex_unlock(&aac_mutex);
+
+	mutex_lock(&aac->ioctl_mutex);
+	ret = aac_do_ioctl(aac, cmd, (void __user *)arg);
+	mutex_unlock(&aac->ioctl_mutex);
 
 	return ret;
 }

drivers/scsi/aacraid/linit.c static long aac_cfg_ioctl(struct file *file, · line 732

Quoted 7 lines
drivers/scsi/aacraid/linit.c +3 -1
@@ -719,7 +727,10 @@ static long aac_cfg_ioctl(struct file *file,
 static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long arg)
 {
 	long ret;
-	mutex_lock(&aac_mutex);
+
+	if (dev->adapter_shutdown)
+		return -EACCES;

There is another test for the same in aac_do_ioctl, this duplicated test is needless.

Quoted 74 lines
drivers/scsi/aacraid/linit.c +23 -6
+
 	switch (cmd) {
 	case FSACTL_MINIPORT_REV_CHECK:
 	case FSACTL_SENDFIB:
@@ -753,23 +764,37 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long
 		ret = -ENOIOCTLCMD;
 		break;
 	}
-	mutex_unlock(&aac_mutex);
 	return ret;
 }
 
 static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
 {
-	struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
+	int ret;
+	struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
+
 	if (!capable(CAP_SYS_RAWIO))
 		return -EPERM;
-	return aac_compat_do_ioctl(dev, cmd, (unsigned long)arg);
+
+	mutex_lock(&aac->ioctl_mutex);
+	ret = aac_compat_do_ioctl(aac, cmd, (unsigned long)arg);
+	mutex_unlock(&aac->ioctl_mutex);
+
+	return ret;
 }
 
 static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned long arg)
 {
+	int ret;
+	struct aac_dev *aac = (struct aac_dev *)file->private_data;
+
 	if (!capable(CAP_SYS_RAWIO))
 		return -EPERM;
-	return aac_compat_do_ioctl(file->private_data, cmd, arg);
+
+	mutex_lock(&aac->ioctl_mutex);
+	ret =  aac_compat_do_ioctl(aac, cmd, arg);
+	mutex_unlock(&aac->ioctl_mutex);
+
+	return ret;
 }
 #endif
 
@@ -1078,6 +1103,8 @@ static void __aac_shutdown(struct aac_dev * aac)
 	int i;
 	int cpu;
 
+	aac_send_shutdown(aac);
+
 	if (aac->aif_thread) {
 		int i;
 		/* Clear out events first */
@@ -1089,7 +1116,7 @@ static void __aac_shutdown(struct aac_dev * aac)
 		}
 		kthread_stop(aac->thread);
 	}
-	aac_send_shutdown(aac);
+
 	aac_adapter_disable_int(aac);
 	cpu = cpumask_first(cpu_online_mask);
 	if (aac->pdev->device == PMC_DEVICE_S6 ||
@@ -1193,7 +1220,7 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 	if (!aac->fibs)
 		goto out_free_host;
 	spin_lock_init(&aac->fib_lock);
-
+	mutex_init(&aac->ioctl_mutex);
 	/*
 	 *	Map in the registers from the adapter.
 	 */

drivers/scsi/aacraid/linit.c static int aac_resume(struct pci_dev *pdev) · line 1506

Quoted 6 lines
drivers/scsi/aacraid/linit.c +2 -0
@@ -1474,7 +1501,10 @@ static int aac_resume(struct pci_dev *pdev)
 	* reset this flag to unblock ioctl() as it was set at
 	* aac_send_shutdown() to block ioctls from upperlayer
 	*/
+	mutex_lock(&aac->ioctl_mutex);
 	aac->adapter_shutdown = 0;
+	mutex_unlock(&aac->ioctl_mutex);

A mutex surrounding adapter_shutdown = 0; is needless.

drivers/scsi/aacraid/linit.c static void aac_pci_resume(struct pci_dev *pdev) · line 1668

Quoted 11 lines
drivers/scsi/aacraid/linit.c +3 -0
+
 	scsi_unblock_requests(shost);
 
 	return 0;
@@ -1633,7 +1663,10 @@ static void aac_pci_resume(struct pci_dev *pdev)
 	 * reset this flag to unblock ioctl() as it was set
 	 * at aac_send_shutdown() to block ioctls from upperlayer
 	 */
+	mutex_lock(&aac->ioctl_mutex);
 	aac->adapter_shutdown = 0;
+	mutex_unlock(&aac->ioctl_mutex);

Same here.

aac_compat_do_ioctl and aac_do_ioctl is surrounded by mutexes - that is fine, but by moving the mutex down to aac_do_ioctl the code would be easier and more readable.

With the new mutex, you have changed the functionality so that a new patch is needed for that - before this patch there was no mutex in the main .ioctl path.

I have found no functional issues so regardless whether you follow my comments now, later or never -

Cheers
Tomas

Quoted 4 lines
drivers/scsi/aacraid/linit.c +1 -0
+
 	aac->handle_pci_error = 0;
 
 	shost_for_each_device(sdev, shost)
#10 lore raw

RE: [PATCH V4 7/9] aacraid: Fix AIF triggered IOP_RESET

Hello Tomas,

Quoted 147 lines

-----Original Message-----
From: Tomas Henzl [mailto:[email protected]]
Sent: Monday, February 1, 2016 8:44 AM
To: Raghava Aditya Renukunta; [email protected]; [email protected]; [email protected]
Cc: Mahesh Rajashekhara; Murthy Bhat; Gana Sridaran; aacraid@pmc- sierra.com; Scott Benesh; [email protected]; [email protected]
Subject: Re: [PATCH V4 7/9] aacraid: Fix AIF triggered IOP_RESET

Quoted 17 lines · Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

while driver removal is in progress or PCI shutdown is invoked, driver kills AIF aacraid thread, but IOCTL requests from the management tools re-start AIF thread leading to IOP_RESET.

Fixed by setting adapter_shutdown flag when PCI shutdown is invoked.

Changes in V2:
Set adapter_shutdown flag before shutdown command is sent to \
controller

Changes in V3:
Call aac_send_shut_shutdown first thing in __aac_shutdown Convert adapter_shutdown to atomic_t variable to prevent \
SMP coherency issues(race conditions)

Quoted 5 lines

Changes in V4:
Used mutex to protect ioctl path and adapter_shutdown to prevent \
race conditions.

Signed-off-by Raghava Aditya Renukunta

<[email protected]>

Quoted 7 lines
---
 drivers/scsi/aacraid/aacraid.h  |  2 +-
 drivers/scsi/aacraid/commctrl.c |  3 ++
 drivers/scsi/aacraid/comminit.c |  6 ++--
 drivers/scsi/aacraid/linit.c    | 63 +++++++++++++++++++++++++++++++--

--------

Review

Quoted 16 lines
 4 files changed, 56 insertions(+), 18 deletions(-)
drivers/scsi/aacraid/aacraid.h +1 -1
index 2916288..6c55749 100644
@@ -1123,7 +1123,7 @@ struct aac_dev
 
 	struct fib		*free_fib;
 	spinlock_t		fib_lock;
-
+	struct mutex		ioctl_mutex;
 	struct aac_queue_block *queues;
 	/*
 	 *	The user API will use an IOCTL to register itself to receive
(quoted diff) +0 -0

b/drivers/scsi/aacraid/commctrl.c

drivers/scsi/aacraid/commctrl.c int aac_do_ioctl(struct aac_dev * dev, int cmd, void

Quoted 4 lines

index 54195a1..8d3438c 100644

drivers/scsi/aacraid/commctrl.c +0 -0
@@ -855,6 +855,9 @@ int aac_do_ioctl(struct aac_dev * dev, int cmd, void

__user *arg)

Review

Quoted 10 lines
drivers/scsi/aacraid/commctrl.c +3 -0
 {
 	int status;
 
+	if (dev->adapter_shutdown)
+		return -EACCES;
+
 	/*
 	 *	HBA gets first crack
 	 */
(quoted diff) +0 -0

b/drivers/scsi/aacraid/comminit.c

Quoted 17 lines

index 0e954e3..2b4e753 100644

drivers/scsi/aacraid/comminit.c +4 -1
@@ -212,8 +212,11 @@ int aac_send_shutdown(struct aac_dev * dev)
 		return -ENOMEM;
 	aac_fib_init(fibctx);
 
-	cmd = (struct aac_close *) fib_data(fibctx);
+	mutex_lock(&dev->ioctl_mutex);
+	dev->adapter_shutdown = 1;
+	mutex_unlock(&dev->ioctl_mutex);
 
+	cmd = (struct aac_close *) fib_data(fibctx);
 	cmd->command = cpu_to_le32(VM_CloseAll);
 	cmd->cid = cpu_to_le32(0xfffffffe);
 

drivers/scsi/aacraid/comminit.c int aac_send_shutdown(struct aac_dev * dev) · line 232

Quoted 1 line
drivers/scsi/aacraid/comminit.c +0 -0
@@ -229,7 +232,6 @@ int aac_send_shutdown(struct aac_dev * dev)
 	/* FIB should be freed only after getting the response from the F/W

*/

Quoted 52 lines
drivers/scsi/aacraid/comminit.c +0 -1
 	if (status != -ERESTARTSYS)
 		aac_fib_free(fibctx);
-	dev->adapter_shutdown = 1;
 	if ((dev->pdev->device == PMC_DEVICE_S7 ||
 	     dev->pdev->device == PMC_DEVICE_S8 ||
 	     dev->pdev->device == PMC_DEVICE_S9) &&
drivers/scsi/aacraid/linit.c +16 -8
index af8974e..9453e11 100644
@@ -524,10 +524,17 @@ static struct device_attribute *aac_dev_attrs[] = {
 
 static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg)
 {
-	struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
+	int ret;
+	struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
+
 	if (!capable(CAP_SYS_RAWIO))
 		return -EPERM;
-	return aac_do_ioctl(dev, cmd, arg);
+
+	mutex_lock(&aac->ioctl_mutex);
+	ret = aac_do_ioctl(aac, cmd, arg);
+	mutex_unlock(&aac->ioctl_mutex);
+
+	return ret;
 }
 
 static int aac_eh_abort(struct scsi_cmnd* cmd)
@@ -704,13 +711,14 @@ static long aac_cfg_ioctl(struct file *file,
 		unsigned int cmd, unsigned long arg)
 {
 	int ret;
-	struct aac_dev *aac;
-	aac = (struct aac_dev *)file->private_data;
-	if (!capable(CAP_SYS_RAWIO) || aac->adapter_shutdown)
+	struct aac_dev *aac = (struct aac_dev *)file->private_data;
+
+	if (!capable(CAP_SYS_RAWIO))
 		return -EPERM;
-	mutex_lock(&aac_mutex);
-	ret = aac_do_ioctl(file->private_data, cmd, (void __user *)arg);
-	mutex_unlock(&aac_mutex);
+
+	mutex_lock(&aac->ioctl_mutex);
+	ret = aac_do_ioctl(aac, cmd, (void __user *)arg);
+	mutex_unlock(&aac->ioctl_mutex);
 
 	return ret;
 }

drivers/scsi/aacraid/linit.c static long aac_cfg_ioctl(struct file *file, · line 727

Quoted 1 line
drivers/scsi/aacraid/linit.c +0 -0
@@ -719,7 +727,10 @@ static long aac_cfg_ioctl(struct file *file,
 static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd,

unsigned long arg)

Quoted 9 lines

drivers/scsi/aacraid/linit.c static long aac_cfg_ioctl(struct file *file, · line 732

Quoted 6 lines
drivers/scsi/aacraid/linit.c +3 -1
 {
 	long ret;
-	mutex_lock(&aac_mutex);
+
+	if (dev->adapter_shutdown)
+		return -EACCES;

There is another test for the same in aac_do_ioctl, this duplicated test is needless.

Will remove

Quoted 78 lines

drivers/scsi/aacraid/linit.c static long aac_compat_do_ioctl(struct aac_dev

Quoted 5 lines
drivers/scsi/aacraid/linit.c +1 -0
+
 	switch (cmd) {
 	case FSACTL_MINIPORT_REV_CHECK:
 	case FSACTL_SENDFIB:
@@ -753,23 +764,37 @@ static long aac_compat_do_ioctl(struct aac_dev

*dev, unsigned cmd, unsigned long

drivers/scsi/aacraid/linit.c static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long

Quoted 8 lines
drivers/scsi/aacraid/linit.c +0 -1
 		ret = -ENOIOCTLCMD;
 		break;
 	}
-	mutex_unlock(&aac_mutex);
 	return ret;
 }
 
 static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user

*arg)

Quoted 7 lines
drivers/scsi/aacraid/linit.c +3 -1
 {
-	struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
+	int ret;
+	struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
+
 	if (!capable(CAP_SYS_RAWIO))
 		return -EPERM;

drivers/scsi/aacraid/linit.c static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long

Quoted 10 lines
drivers/scsi/aacraid/linit.c +6 -1
-	return aac_compat_do_ioctl(dev, cmd, (unsigned long)arg);
+
+	mutex_lock(&aac->ioctl_mutex);
+	ret = aac_compat_do_ioctl(aac, cmd, (unsigned long)arg);
+	mutex_unlock(&aac->ioctl_mutex);
+
+	return ret;
 }
 
 static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned

long arg)

drivers/scsi/aacraid/linit.c static int aac_probe_one(struct pci_dev *pdev,

Quoted 35 lines
drivers/scsi/aacraid/linit.c +12 -2
 {
+	int ret;
+	struct aac_dev *aac = (struct aac_dev *)file->private_data;
+
 	if (!capable(CAP_SYS_RAWIO))
 		return -EPERM;
-	return aac_compat_do_ioctl(file->private_data, cmd, arg);
+
+	mutex_lock(&aac->ioctl_mutex);
+	ret =  aac_compat_do_ioctl(aac, cmd, arg);
+	mutex_unlock(&aac->ioctl_mutex);
+
+	return ret;
 }
 #endif
 
@@ -1078,6 +1103,8 @@ static void __aac_shutdown(struct aac_dev * aac)
 	int i;
 	int cpu;
 
+	aac_send_shutdown(aac);
+
 	if (aac->aif_thread) {
 		int i;
 		/* Clear out events first */
@@ -1089,7 +1116,7 @@ static void __aac_shutdown(struct aac_dev * aac)
 		}
 		kthread_stop(aac->thread);
 	}
-	aac_send_shutdown(aac);
+
 	aac_adapter_disable_int(aac);
 	cpu = cpumask_first(cpu_online_mask);
 	if (aac->pdev->device == PMC_DEVICE_S6 ||
@@ -1193,7 +1220,7 @@ static int aac_probe_one(struct pci_dev *pdev,

const struct pci_device_id *id)

Quoted 9 lines
drivers/scsi/aacraid/linit.c +1 -1
 	if (!aac->fibs)
 		goto out_free_host;
 	spin_lock_init(&aac->fib_lock);
-
+	mutex_init(&aac->ioctl_mutex);
 	/*
 	 *	Map in the registers from the adapter.
 	 */
@@ -1474,7 +1501,10 @@ static int aac_resume(struct pci_dev *pdev)
Quoted 8 lines

drivers/scsi/aacraid/linit.c static int aac_resume(struct pci_dev *pdev) · line 1506

Quoted 6 lines
drivers/scsi/aacraid/linit.c +2 -0
 	* reset this flag to unblock ioctl() as it was set at
 	* aac_send_shutdown() to block ioctls from upperlayer
 	*/
+	mutex_lock(&aac->ioctl_mutex);
 	aac->adapter_shutdown = 0;
+	mutex_unlock(&aac->ioctl_mutex);

A mutex surrounding adapter_shutdown = 0; is needless.

Will Remove

Quoted 6 lines

drivers/scsi/aacraid/linit.c static void aac_pci_resume(struct pci_dev

Quoted 5 lines
drivers/scsi/aacraid/linit.c +1 -0
+
 	scsi_unblock_requests(shost);
 
 	return 0;
@@ -1633,7 +1663,10 @@ static void aac_pci_resume(struct pci_dev

*pdev)

Quoted 8 lines

drivers/scsi/aacraid/linit.c static void aac_pci_resume(struct pci_dev *pdev) · line 1668

Quoted 6 lines
drivers/scsi/aacraid/linit.c +2 -0
 	 * reset this flag to unblock ioctl() as it was set
 	 * at aac_send_shutdown() to block ioctls from upperlayer
 	 */
+	mutex_lock(&aac->ioctl_mutex);
 	aac->adapter_shutdown = 0;
+	mutex_unlock(&aac->ioctl_mutex);

Same here.

Will Remove

Quoted 10 lines

aac_compat_do_ioctl and aac_do_ioctl is surrounded by mutexes - that is fine,
but by moving the mutex down to aac_do_ioctl the code would be easier and more readable.

With the new mutex, you have changed the functionality so that a new patch is needed for that - before this patch there was no mutex in the main .ioctl path.

Quoted 7 lines

I have found no functional issues so regardless whether you follow my comments now, later or never -

Cheers
Tomas

I will make the changes that you have suggested ,
Create a new patch for the new mutex and apply this patch on top of it.

Thank you Tomas.

Regards,
Raghava Aditya

Quoted 12 lines
Quoted 12 lines
drivers/scsi/aacraid/linit.c +1 -0
+
 	aac->handle_pci_error = 0;
 
 	shost_for_each_device(sdev, shost)
#11 lore raw

PATCH v4 8/9 aacraid: Fix character device re-initialization

In reply to Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

During EEH PCI hotplug activity kernel unloads and loads the driver, causing character device to be unregistered(aac_remove_one).When the driver is loaded back using aac_probe_one the character device needs to be registered again for the AIF management tools to work.

Fixed by adding code to register character device in aac_probe_one if it is unregistered in aac_remove_one.

Changes in V2:
Added macros to track character device state

Changes in V3:
None

Changes in V4:
None

---
 drivers/scsi/aacraid/aacraid.h |  7 +++++++
 drivers/scsi/aacraid/linit.c   | 21 ++++++++++++++-------
 2 files changed, 21 insertions(+), 7 deletions(-)
drivers/scsi/aacraid/aacraid.h +7 -0
index 6c55749..332e3c9 100644
@@ -94,6 +94,13 @@ enum {
 #define aac_phys_to_logical(x)  ((x)+1)
 #define aac_logical_to_phys(x)  ((x)?(x)-1:0)
 
+/*
+ * These macros are for keeping track of
+ * character device state.
+ */
+#define AAC_CHARDEV_UNREGISTERED	(-1)
+#define AAC_CHARDEV_NEEDS_REINIT	(-2)
+
 /* #define AAC_DETAILED_STATUS_INFO */
 
 struct diskparm
drivers/scsi/aacraid/linit.c +14 -7
index 9453e11..a43c1dd 100644
@@ -80,7 +80,7 @@ MODULE_VERSION(AAC_DRIVER_FULL_VERSION);
 
 static DEFINE_MUTEX(aac_mutex);
 static LIST_HEAD(aac_devices);
-static int aac_cfg_major = -1;
+static int aac_cfg_major = AAC_CHARDEV_UNREGISTERED;
 char aac_driver_version[] = AAC_DRIVER_FULL_VERSION;
 
 /*
@@ -1150,6 +1150,13 @@ static void __aac_shutdown(struct aac_dev * aac)
 	else if (aac->max_msix > 1)
 		pci_disable_msix(aac->pdev);
 }
+static void aac_init_char(void)
+{
+	aac_cfg_major = register_chrdev(0, "aac", &aac_cfg_fops);
+	if (aac_cfg_major < 0) {
+		pr_err("aacraid: unable to register \"aac\" device.\n");
+	}
+}
 
 static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
@@ -1207,6 +1214,9 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 	shost->max_cmd_len = 16;
 	shost->use_cmd_list = 1;
 
+	if (aac_cfg_major == AAC_CHARDEV_NEEDS_REINIT)
+		aac_init_char();
+
 	aac = (struct aac_dev *)shost->hostdata;
 	aac->base_start = pci_resource_start(pdev, 0);
 	aac->scsi_host_ptr = shost;
@@ -1547,7 +1557,7 @@ static void aac_remove_one(struct pci_dev *pdev)
 	pci_disable_device(pdev);
 	if (list_empty(&aac_devices)) {
 		unregister_chrdev(aac_cfg_major, "aac");
-		aac_cfg_major = -1;
+		aac_cfg_major = AAC_CHARDEV_NEEDS_REINIT;
 	}
 }
 
@@ -1710,11 +1720,8 @@ static int __init aac_init(void)
 	if (error < 0)
 		return error;
 
-	aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops);
-	if (aac_cfg_major < 0) {
-		printk(KERN_WARNING
-			"aacraid: unable to register \"aac\" device.\n");
-	}
+	aac_init_char();
+
 
 	return 0;
 }
Signature · 1 line
1.9.1
#12 lore raw

PATCH v4 9/9 aacraid: Update driver version

In reply to Raghava Aditya Renukunta

From: Raghava Aditya Renukunta <[email protected]>

Updated diver version to 41052

Changes in V2:
None

Changes in V3:
None

Changes in V4:
None

---
 drivers/scsi/aacraid/aacraid.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/aacraid/aacraid.h +1 -1
index 332e3c9..b5f4f09 100644
@@ -62,7 +62,7 @@ enum {
 #define	PMC_GLOBAL_INT_BIT0		0x00000001
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 41010
+# define AAC_DRIVER_BUILD 41052
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS	32
Signature · 1 line
1.9.1
#13 lore raw
In reply to Raghava Aditya Renukunta
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Raghava" == Raghava Aditya Renukunta <[email protected]> writes:

Raghava,

Raghava> This patchset includes the following changes (bug fixes and new Raghava> feature support) specific to aacraid driver.

Please fix the build failure in patch 3/9 when CONFIG_PM is not defined and address Tomas' comments for 7/9.

Signature · 1 line
Martin K. Petersen	Oracle Linux Engineering
#14 lore raw

Hello Martin,

Quoted 14 lines

-----Original Message-----
From: Martin K. Petersen [mailto:[email protected]]
Sent: Monday, February 1, 2016 4:57 PM
To: Raghava Aditya Renukunta
Cc: [email protected]; [email protected]; [email protected]; Mahesh Rajashekhara; Murthy Bhat; Gana Sridaran; [email protected]; Scott Benesh; [email protected]; [email protected]; [email protected]
Subject: Re: [PATCH V4 0/9] aacraid: Patchset for aacraid driver version 41052

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Raghava" == Raghava Aditya Renukunta

<[email protected]> writes:

Quoted 7 lines

Raghava,

Raghava> This patchset includes the following changes (bug fixes and new Raghava> feature support) specific to aacraid driver.

Please fix the build failure in patch 3/9 when CONFIG_PM is not defined and address Tomas' comments for 7/9.

I will create a new patch version fixing these issues shortly.

Thank you Martin.
Regards,
Raghava Aditya

Quoted 2 lines

--
Martin K. Petersen Oracle Linux Engineering