aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-09-04 18:33:53 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-09-05 10:17:57 -0400
commit45eab7ccacb2c2e63f7645fa92a7f742898044b4 (patch)
treefa68a9b60a27cb6244c5093c1be4db3620c49512 /drivers/net/wireless/iwlwifi
parent12bf6f45d17038589e0eaa8adeb7ee8169c0e4de (diff)
iwlwifi: reduce overhead if tracing disabled
Tracing commands builds an array of trace data items even when the tracepoint is disabled. Instead, loop in the tracepoint assignment. This reduces overhead if tracing is compiled into the driver but not enabled and slightly reduces overall driver size as well: text data bss dec hex filename 114514 6509 48 121071 1d8ef before/iwlwifi.ko 114189 6509 48 120746 1d7aa after/iwlwifi.ko Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Reviewed-by: Max Stepanov <Max.Stepanov@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-devtrace.h34
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/tx.c25
2 files changed, 23 insertions, 36 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-devtrace.h b/drivers/net/wireless/iwlwifi/iwl-devtrace.h
index 06ca505bb2cc..59a5f78402fc 100644
--- a/drivers/net/wireless/iwlwifi/iwl-devtrace.h
+++ b/drivers/net/wireless/iwlwifi/iwl-devtrace.h
@@ -29,6 +29,7 @@
29 29
30#include <linux/tracepoint.h> 30#include <linux/tracepoint.h>
31#include <linux/device.h> 31#include <linux/device.h>
32#include "iwl-trans.h"
32 33
33 34
34#if !defined(CONFIG_IWLWIFI_DEVICE_TRACING) || defined(__CHECKER__) 35#if !defined(CONFIG_IWLWIFI_DEVICE_TRACING) || defined(__CHECKER__)
@@ -237,27 +238,34 @@ TRACE_EVENT(iwlwifi_dbg,
237#define TRACE_SYSTEM iwlwifi 238#define TRACE_SYSTEM iwlwifi
238 239
239TRACE_EVENT(iwlwifi_dev_hcmd, 240TRACE_EVENT(iwlwifi_dev_hcmd,
240 TP_PROTO(const struct device *dev, u32 flags, 241 TP_PROTO(const struct device *dev,
241 const void *hcmd0, size_t len0, 242 struct iwl_host_cmd *cmd, u16 total_size,
242 const void *hcmd1, size_t len1, 243 const void *hdr, size_t hdr_len),
243 const void *hcmd2, size_t len2), 244 TP_ARGS(dev, cmd, total_size, hdr, hdr_len),
244 TP_ARGS(dev, flags, hcmd0, len0, hcmd1, len1, hcmd2, len2),
245 TP_STRUCT__entry( 245 TP_STRUCT__entry(
246 DEV_ENTRY 246 DEV_ENTRY
247 __dynamic_array(u8, hcmd0, len0) 247 __dynamic_array(u8, hcmd, total_size)
248 __dynamic_array(u8, hcmd1, len1)
249 __dynamic_array(u8, hcmd2, len2)
250 __field(u32, flags) 248 __field(u32, flags)
251 ), 249 ),
252 TP_fast_assign( 250 TP_fast_assign(
251 int i, offset = hdr_len;
252
253 DEV_ASSIGN; 253 DEV_ASSIGN;
254 memcpy(__get_dynamic_array(hcmd0), hcmd0, len0); 254 __entry->flags = cmd->flags;
255 memcpy(__get_dynamic_array(hcmd1), hcmd1, len1); 255 memcpy(__get_dynamic_array(hcmd), hdr, hdr_len);
256 memcpy(__get_dynamic_array(hcmd2), hcmd2, len2); 256
257 __entry->flags = flags; 257 for (i = 0; i < IWL_MAX_CMD_TFDS; i++) {
258 if (!cmd->len[i])
259 continue;
260 if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
261 continue;
262 memcpy((u8 *)__get_dynamic_array(hcmd) + offset,
263 cmd->data[i], cmd->len[i]);
264 offset += cmd->len[i];
265 }
258 ), 266 ),
259 TP_printk("[%s] hcmd %#.2x (%ssync)", 267 TP_printk("[%s] hcmd %#.2x (%ssync)",
260 __get_str(dev), ((u8 *)__get_dynamic_array(hcmd0))[0], 268 __get_str(dev), ((u8 *)__get_dynamic_array(hcmd))[0],
261 __entry->flags & CMD_ASYNC ? "a" : "") 269 __entry->flags & CMD_ASYNC ? "a" : "")
262); 270);
263 271
diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c
index 392d2bc5e357..105e3af3c621 100644
--- a/drivers/net/wireless/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/tx.c
@@ -522,11 +522,6 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
522 bool had_nocopy = false; 522 bool had_nocopy = false;
523 int i; 523 int i;
524 u32 cmd_pos; 524 u32 cmd_pos;
525#ifdef CONFIG_IWLWIFI_DEVICE_TRACING
526 const void *trace_bufs[IWL_MAX_CMD_TFDS + 1] = {};
527 int trace_lens[IWL_MAX_CMD_TFDS + 1] = {};
528 int trace_idx;
529#endif
530 525
531 copy_size = sizeof(out_cmd->hdr); 526 copy_size = sizeof(out_cmd->hdr);
532 cmd_size = sizeof(out_cmd->hdr); 527 cmd_size = sizeof(out_cmd->hdr);
@@ -628,11 +623,6 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
628 dma_unmap_len_set(out_meta, len, copy_size); 623 dma_unmap_len_set(out_meta, len, copy_size);
629 624
630 iwlagn_txq_attach_buf_to_tfd(trans, txq, phys_addr, copy_size, 1); 625 iwlagn_txq_attach_buf_to_tfd(trans, txq, phys_addr, copy_size, 1);
631#ifdef CONFIG_IWLWIFI_DEVICE_TRACING
632 trace_bufs[0] = &out_cmd->hdr;
633 trace_lens[0] = copy_size;
634 trace_idx = 1;
635#endif
636 626
637 for (i = 0; i < IWL_MAX_CMD_TFDS; i++) { 627 for (i = 0; i < IWL_MAX_CMD_TFDS; i++) {
638 if (!cmd->len[i]) 628 if (!cmd->len[i])
@@ -651,25 +641,14 @@ static int iwl_enqueue_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
651 641
652 iwlagn_txq_attach_buf_to_tfd(trans, txq, phys_addr, 642 iwlagn_txq_attach_buf_to_tfd(trans, txq, phys_addr,
653 cmd->len[i], 0); 643 cmd->len[i], 0);
654#ifdef CONFIG_IWLWIFI_DEVICE_TRACING
655 trace_bufs[trace_idx] = cmd->data[i];
656 trace_lens[trace_idx] = cmd->len[i];
657 trace_idx++;
658#endif
659 } 644 }
660 645
661 out_meta->flags = cmd->flags; 646 out_meta->flags = cmd->flags;
662 647
663 txq->need_update = 1; 648 txq->need_update = 1;
664 649
665 /* check that tracing gets all possible blocks */ 650 trace_iwlwifi_dev_hcmd(trans->dev, cmd, cmd_size,
666 BUILD_BUG_ON(IWL_MAX_CMD_TFDS + 1 != 3); 651 &out_cmd->hdr, copy_size);
667#ifdef CONFIG_IWLWIFI_DEVICE_TRACING
668 trace_iwlwifi_dev_hcmd(trans->dev, cmd->flags,
669 trace_bufs[0], trace_lens[0],
670 trace_bufs[1], trace_lens[1],
671 trace_bufs[2], trace_lens[2]);
672#endif
673 652
674 /* start timer if queue currently empty */ 653 /* start timer if queue currently empty */
675 if (q->read_ptr == q->write_ptr && trans_pcie->wd_timeout) 654 if (q->read_ptr == q->write_ptr && trans_pcie->wd_timeout)