From 0288c7c9754d45531944992e8731d1ee9c59ecc3 Mon Sep 17 00:00:00 2001 From: Tomas Winkler Date: Mon, 6 Jun 2011 10:44:34 +0300 Subject: [PATCH] staging: mei: io_list functions revamp 1. remove list used for loop. There were only 2 loops used in non time critical places so we can safely unroll them 2. normalize functions names operating on io_list to mei_io_list_ 3. rename mei_fe_same_id to mei_cl_cmp_id used for comparing list elements containing struct mei_cl 4. group together io_list functions in the header file Signed-off-by: Tomas Winkler Signed-off-by: Oren Weil Signed-off-by: Greg Kroah-Hartman --- drivers/staging/mei/init.c | 87 ++++++++++++++++----------------- drivers/staging/mei/interrupt.c | 2 +- drivers/staging/mei/iorw.c | 6 +-- drivers/staging/mei/main.c | 12 ++--- drivers/staging/mei/mei_dev.h | 49 +++++++++---------- 5 files changed, 74 insertions(+), 82 deletions(-) diff --git a/drivers/staging/mei/init.c b/drivers/staging/mei/init.c index b67f3b8f834..eb70e70a274 100644 --- a/drivers/staging/mei/init.c +++ b/drivers/staging/mei/init.c @@ -29,12 +29,12 @@ const uuid_le mei_amthi_guid = UUID_LE(0x12f80028, 0xb4b7, 0x4b2d, 0xac, 0x81, 0x4c); /** - * mei_initialize_list - Sets up a queue list. + * mei_io_list_init - Sets up a queue list. * - * @list: An instance of our list structure + * @list: An instance io list structure * @dev: the device structure */ -void mei_initialize_list(struct mei_io_list *list, struct mei_device *dev) +void mei_io_list_init(struct mei_io_list *list) { /* initialize our queue list */ INIT_LIST_HEAD(&list->mei_cb.cb_list); @@ -42,40 +42,16 @@ void mei_initialize_list(struct mei_io_list *list, struct mei_device *dev) } /** - * mei_flush_queues - flushes queue lists belonging to cl. - * - * @dev: the device structure - * @cl: private data of the file object - */ -void mei_flush_queues(struct mei_device *dev, struct mei_cl *cl) -{ - int i; - - if (!dev || !cl) - return; - - for (i = 0; i < MEI_IO_LISTS_NUMBER; i++) { - dev_dbg(&dev->pdev->dev, "remove list entry belonging to cl\n"); - mei_flush_list(dev->io_list_array[i], cl); - } -} - - -/** - * mei_flush_list - removes list entry belonging to cl. + * mei_io_list_flush - removes list entry belonging to cl. * * @list: An instance of our list structure * @cl: private data of the file object */ -void mei_flush_list(struct mei_io_list *list, struct mei_cl *cl) +void mei_io_list_flush(struct mei_io_list *list, struct mei_cl *cl) { - struct mei_cl *cl_tmp; struct mei_cl_cb *cb_pos = NULL; struct mei_cl_cb *cb_next = NULL; - if (!list || !cl) - return; - if (list->status != 0) return; @@ -85,14 +61,36 @@ void mei_flush_list(struct mei_io_list *list, struct mei_cl *cl) list_for_each_entry_safe(cb_pos, cb_next, &list->mei_cb.cb_list, cb_list) { if (cb_pos) { - cl_tmp = (struct mei_cl *) - cb_pos->file_private; - if (cl_tmp && - mei_fe_same_id(cl, cl_tmp)) + struct mei_cl *cl_tmp; + cl_tmp = (struct mei_cl *)cb_pos->file_private; + if (mei_cl_cmp_id(cl, cl_tmp)) list_del(&cb_pos->cb_list); } } } +/** + * mei_cl_flush_queues - flushes queue lists belonging to cl. + * + * @dev: the device structure + * @cl: private data of the file object + */ +int mei_cl_flush_queues(struct mei_cl *cl) +{ + if (!cl || !cl->dev) + return -EINVAL; + + dev_dbg(&cl->dev->pdev->dev, "remove list entry belonging to cl\n"); + mei_io_list_flush(&cl->dev->read_list, cl); + mei_io_list_flush(&cl->dev->write_list, cl); + mei_io_list_flush(&cl->dev->write_waiting_list, cl); + mei_io_list_flush(&cl->dev->ctrl_wr_list, cl); + mei_io_list_flush(&cl->dev->ctrl_rd_list, cl); + mei_io_list_flush(&cl->dev->amthi_cmd_list, cl); + mei_io_list_flush(&cl->dev->amthi_read_complete_list, cl); + return 0; +} + + /** * mei_reset_iamthif_params - initializes mei device iamthif @@ -120,7 +118,6 @@ static void mei_reset_iamthif_params(struct mei_device *dev) */ struct mei_device *mei_device_init(struct pci_dev *pdev) { - int i; struct mei_device *dev; dev = kzalloc(sizeof(struct mei_device), GFP_KERNEL); @@ -128,13 +125,6 @@ struct mei_device *mei_device_init(struct pci_dev *pdev) return NULL; /* setup our list array */ - dev->io_list_array[0] = &dev->read_list; - dev->io_list_array[1] = &dev->write_list; - dev->io_list_array[2] = &dev->write_waiting_list; - dev->io_list_array[3] = &dev->ctrl_wr_list; - dev->io_list_array[4] = &dev->ctrl_rd_list; - dev->io_list_array[5] = &dev->amthi_cmd_list; - dev->io_list_array[6] = &dev->amthi_read_complete_list; INIT_LIST_HEAD(&dev->file_list); INIT_LIST_HEAD(&dev->wd_cl.link); INIT_LIST_HEAD(&dev->iamthif_cl.link); @@ -143,8 +133,15 @@ struct mei_device *mei_device_init(struct pci_dev *pdev) init_waitqueue_head(&dev->wait_stop_wd); dev->mei_state = MEI_INITIALIZING; dev->iamthif_state = MEI_IAMTHIF_IDLE; - for (i = 0; i < MEI_IO_LISTS_NUMBER; i++) - mei_initialize_list(dev->io_list_array[i], dev); + + + mei_io_list_init(&dev->read_list); + mei_io_list_init(&dev->write_list); + mei_io_list_init(&dev->write_waiting_list); + mei_io_list_init(&dev->ctrl_wr_list); + mei_io_list_init(&dev->ctrl_rd_list); + mei_io_list_init(&dev->amthi_cmd_list); + mei_io_list_init(&dev->amthi_read_complete_list); dev->pdev = pdev; return dev; } @@ -737,8 +734,8 @@ int mei_disconnect_host_client(struct mei_device *dev, struct mei_cl *cl) dev_dbg(&dev->pdev->dev, "failed to disconnect from FW client.\n"); } - mei_flush_list(&dev->ctrl_rd_list, cl); - mei_flush_list(&dev->ctrl_wr_list, cl); + mei_io_list_flush(&dev->ctrl_rd_list, cl); + mei_io_list_flush(&dev->ctrl_wr_list, cl); free: mei_free_cb_private(cb); return rets; diff --git a/drivers/staging/mei/interrupt.c b/drivers/staging/mei/interrupt.c index b4ad947bcc5..2ff30ee9058 100644 --- a/drivers/staging/mei/interrupt.c +++ b/drivers/staging/mei/interrupt.c @@ -1538,7 +1538,7 @@ irqreturn_t mei_interrupt_thread_handler(int irq, void *dev_id) dev_dbg(&dev->pdev->dev, "function called after ISR to handle the interrupt processing.\n"); /* initialize our complete list */ mutex_lock(&dev->device_lock); - mei_initialize_list(&complete_list, dev); + mei_io_list_init(&complete_list); dev->host_hw_state = mei_hcsr_read(dev); dev->me_hw_state = mei_mecsr_read(dev); diff --git a/drivers/staging/mei/iorw.c b/drivers/staging/mei/iorw.c index d5f1457f8cf..8a61d126651 100644 --- a/drivers/staging/mei/iorw.c +++ b/drivers/staging/mei/iorw.c @@ -121,7 +121,7 @@ int mei_ioctl_connect_client(struct file *file, clear_bit(cl->host_client_id, dev->host_clients_map); list_for_each_entry_safe(cl_pos, cl_next, &dev->file_list, link) { - if (mei_fe_same_id(cl, cl_pos)) { + if (mei_cl_cmp_id(cl, cl_pos)) { dev_dbg(&dev->pdev->dev, "remove file private data node host" " client = %d, ME client = %d.\n", @@ -204,8 +204,8 @@ int mei_ioctl_connect_client(struct file *file, } rets = -EFAULT; - mei_flush_list(&dev->ctrl_rd_list, cl); - mei_flush_list(&dev->ctrl_wr_list, cl); + mei_io_list_flush(&dev->ctrl_rd_list, cl); + mei_io_list_flush(&dev->ctrl_wr_list, cl); goto end; } rets = 0; diff --git a/drivers/staging/mei/main.c b/drivers/staging/mei/main.c index 917a757d605..24a7dc96937 100644 --- a/drivers/staging/mei/main.c +++ b/drivers/staging/mei/main.c @@ -362,7 +362,6 @@ static struct mei_cl_cb *find_read_list_entry( { struct mei_cl_cb *cb_pos = NULL; struct mei_cl_cb *cb_next = NULL; - struct mei_cl *cl_list_temp; if (!dev->read_list.status && !list_empty(&dev->read_list.mei_cb.cb_list)) { @@ -370,14 +369,11 @@ static struct mei_cl_cb *find_read_list_entry( dev_dbg(&dev->pdev->dev, "remove read_list CB\n"); list_for_each_entry_safe(cb_pos, cb_next, &dev->read_list.mei_cb.cb_list, cb_list) { + struct mei_cl *cl_temp; + cl_temp = (struct mei_cl *)cb_pos->file_private; - cl_list_temp = (struct mei_cl *) - cb_pos->file_private; - - if (cl_list_temp && - mei_fe_same_id(cl, cl_list_temp)) + if (mei_cl_cmp_id(cl, cl_temp)) return cb_pos; - } } return NULL; @@ -478,7 +474,7 @@ static int mei_release(struct inode *inode, struct file *file) cl->me_client_id); rets = mei_disconnect_host_client(dev, cl); } - mei_flush_queues(dev, cl); + mei_cl_flush_queues(cl); dev_dbg(&dev->pdev->dev, "remove client host client = %d, ME client = %d\n", cl->host_client_id, cl->me_client_id); diff --git a/drivers/staging/mei/mei_dev.h b/drivers/staging/mei/mei_dev.h index 904b1bfc33c..d7bc10c612b 100644 --- a/drivers/staging/mei/mei_dev.h +++ b/drivers/staging/mei/mei_dev.h @@ -61,11 +61,6 @@ extern const u8 mei_wd_state_independence_msg[3][4]; */ #define MEI_MAX_OPEN_HANDLE_COUNT 253 -/* - * Number of queue lists used by this driver - */ -#define MEI_IO_LISTS_NUMBER 7 - /* * Number of Maximum MEI Clients */ @@ -178,7 +173,6 @@ struct mei_device { * lists of queues */ /* array of pointers to aio lists */ - struct mei_io_list *io_list_array[MEI_IO_LISTS_NUMBER]; struct mei_io_list read_list; /* driver read queue */ struct mei_io_list write_list; /* driver write queue */ struct mei_io_list write_waiting_list; /* write waiting queue */ @@ -276,9 +270,6 @@ int mei_hw_init(struct mei_device *dev); int mei_task_initialize_clients(void *data); int mei_initialize_clients(struct mei_device *dev); int mei_disconnect_host_client(struct mei_device *dev, struct mei_cl *cl); -void mei_initialize_list(struct mei_io_list *list, struct mei_device *dev); -void mei_flush_list(struct mei_io_list *list, struct mei_cl *cl); -void mei_flush_queues(struct mei_device *dev, struct mei_cl *cl); void mei_remove_client_from_file_list(struct mei_device *dev, u8 host_client_id); void mei_host_init_iamthif(struct mei_device *dev); void mei_allocate_me_clients_storage(struct mei_device *dev); @@ -288,12 +279,35 @@ u8 mei_find_me_client_update_filext(struct mei_device *dev, struct mei_cl *priv, const uuid_le *cguid, u8 client_id); +/* + * MEI IO List Functions + */ +void mei_io_list_init(struct mei_io_list *list); +void mei_io_list_flush(struct mei_io_list *list, struct mei_cl *cl); + /* * MEI ME Client Functions */ struct mei_cl *mei_cl_allocate(struct mei_device *dev); -void mei_cl_init(struct mei_cl *priv, struct mei_device *dev); +void mei_cl_init(struct mei_cl *cl, struct mei_device *dev); +int mei_cl_flush_queues(struct mei_cl *cl); +/** + * mei_cl_cmp_id - tells if file private data have same id + * + * @fe1: private data of 1. file object + * @fe2: private data of 2. file object + * + * returns true - if ids are the same and not NULL + */ +static inline bool mei_cl_cmp_id(const struct mei_cl *cl1, + const struct mei_cl *cl2) +{ + return cl1 && cl2 && + (cl1->host_client_id == cl2->host_client_id) && + (cl1->me_client_id == cl2->me_client_id); +} + /* @@ -408,19 +422,4 @@ void mei_csr_clear_his(struct mei_device *dev); void mei_enable_interrupts(struct mei_device *dev); void mei_disable_interrupts(struct mei_device *dev); -/** - * mei_fe_same_id - tells if file private data have same id - * - * @fe1: private data of 1. file object - * @fe2: private data of 2. file object - * - * returns !=0 - if ids are the same, 0 - if differ. - */ -static inline int mei_fe_same_id(const struct mei_cl *fe1, - const struct mei_cl *fe2) -{ - return ((fe1->host_client_id == fe2->host_client_id) && - (fe1->me_client_id == fe2->me_client_id)); -} - #endif -- 2.39.5