diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c index 
ba17f3b..325c42f 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -177,13 +177,13 @@ nic_stats_display(portid_t port_id)
  	static uint64_t prev_bytes_rx[RTE_MAX_ETHPORTS];
  	static uint64_t prev_bytes_tx[RTE_MAX_ETHPORTS];
  	static uint64_t prev_ns[RTE_MAX_ETHPORTS];
+	struct port_stats_mappings *p_stats_map;
  	struct timespec cur_time;
  	uint64_t diff_pkts_rx, diff_pkts_tx, diff_bytes_rx, diff_bytes_tx,
  								diff_ns;
  	uint64_t mpps_rx, mpps_tx, mbps_rx, mbps_tx;
  	struct rte_eth_stats stats;
-	struct rte_port *port = &ports[port_id];
-	uint8_t i;
+	struct rte_port *port;
   	static const char *nic_stats_border = "########################";
  @@ -195,7 +195,10 @@ nic_stats_display(portid_t port_id)
  	printf("\n  %s NIC statistics for port %-2d %s\n",
  	       nic_stats_border, port_id, nic_stats_border);
  -	if ((!port->rx_queue_stats_mapping_enabled) && 
(!port->tx_queue_stats_mapping_enabled)) {
+	port = &ports[port_id];
+	p_stats_map = &port->p_stats_map;
+	if ((!p_stats_map->rx_queue_stats_mapping_enabled) &&
+		(!p_stats_map->tx_queue_stats_mapping_enabled)) {
  		printf("  RX-packets: %-10"PRIu64" RX-missed: %-10"PRIu64" RX-bytes:  "
  		       "%-"PRIu64"\n",
  		       stats.ipackets, stats.imissed, stats.ibytes); @@ -205,36 
+208,20 @@ nic_stats_display(portid_t port_id)
  		printf("  TX-packets: %-10"PRIu64" TX-errors: %-10"PRIu64" TX-bytes:  "
  		       "%-"PRIu64"\n",
  		       stats.opackets, stats.oerrors, stats.obytes);
-	}
-	else {
-		printf("  RX-packets:              %10"PRIu64"    RX-errors: %10"PRIu64
-		       "    RX-bytes: %10"PRIu64"\n",
-		       stats.ipackets, stats.ierrors, stats.ibytes);
-		printf("  RX-errors:  %10"PRIu64"\n", stats.ierrors);
-		printf("  RX-nombuf:               %10"PRIu64"\n",
+	} else {
+		printf("  RX-packets:             %14"PRIu64"    RX-missed: "
+		       "%14"PRIu64"    RX-bytes: %14"PRIu64"\n",
+		       stats.ipackets, stats.imissed, stats.ibytes);
+		printf("  RX-errors:              %14"PRIu64"\n",
+		       stats.ierrors);
+		printf("  RX-nombuf:              %14"PRIu64"\n",
  		       stats.rx_nombuf);
-		printf("  TX-packets:              %10"PRIu64"    TX-errors: %10"PRIu64
-		       "    TX-bytes: %10"PRIu64"\n",
+		printf("  TX-packets:             %14"PRIu64"    TX-errors: "
+		       "%14"PRIu64"    TX-bytes: %14"PRIu64"\n",
  		       stats.opackets, stats.oerrors, stats.obytes);
  	}
  -	if (port->rx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d RX-packets: %10"PRIu64
-			       "    RX-errors: %10"PRIu64
-			       "    RX-bytes: %10"PRIu64"\n",
-			       i, stats.q_ipackets[i], stats.q_errors[i], stats.q_ibytes[i]);
-		}
-	}
-	if (port->tx_queue_stats_mapping_enabled) {
-		printf("\n");
-		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
-			printf("  Stats reg %2d TX-packets: %10"PRIu64
-			       "                             TX-bytes: %10"PRIu64"\n",
-			       i, stats.q_opackets[i], stats.q_obytes[i]);
-		}
-	}
+	port_stats_mapping_display(port_id, &stats);
   	diff_ns = 0;
  	if (clock_gettime(CLOCK_TYPE_ID, &cur_time) == 0) { @@ -400,7 +387,9 
@@ nic_xstats_clear(portid_t port_id)  void 
nic_stats_mapping_display(portid_t port_id)  {
-	struct rte_port *port = &ports[port_id];
+	struct port_stats_mappings *p_stats_map;
+	struct queue_stats_mappings *q_stats_map;
+	struct rte_port *port;
  	uint16_t i;
   	static const char *nic_stats_mapping_border = 
"########################"; @@ -410,7 +399,10 @@ 
nic_stats_mapping_display(portid_t port_id)
  		return;
  	}
  -	if ((!port->rx_queue_stats_mapping_enabled) && 
(!port->tx_queue_stats_mapping_enabled)) {
+	port = &ports[port_id];
+	p_stats_map = &port->p_stats_map;
+	if ((!p_stats_map->rx_queue_stats_mapping_enabled) &&
+		(!p_stats_map->tx_queue_stats_mapping_enabled)) {
  		printf("Port id %d - either does not support queue statistic mapping or"
  		       " no queue statistic mapping set\n", port_id);
  		return;
@@ -419,24 +411,26 @@ nic_stats_mapping_display(portid_t port_id)
  	printf("\n  %s NIC statistics mapping for port %-2d %s\n",
  	       nic_stats_mapping_border, port_id, nic_stats_mapping_border);
  -	if (port->rx_queue_stats_mapping_enabled) {
-		for (i = 0; i < nb_rx_queue_stats_mappings; i++) {
-			if (rx_queue_stats_mappings[i].port_id == port_id) {
+	if (p_stats_map->rx_queue_stats_mapping_enabled) {
+		for (i = 0; i < p_stats_map->nb_rxq_stats_mappings; i++) {
+			q_stats_map = &p_stats_map->rxq_map_array[i];
+			if (q_stats_map->active) {
  				printf("  RX-queue %2d mapped to Stats Reg %2d\n",
-				       rx_queue_stats_mappings[i].queue_id,
-				       rx_queue_stats_mappings[i].stats_counter_id);
+				       q_stats_map->queue_id,
+				       q_stats_map->stats_counter_id);
  			}
  		}
  		printf("\n");
  	}
   -	if (port->tx_queue_stats_mapping_enabled) {
-		for (i = 0; i < nb_tx_queue_stats_mappings; i++) {
-			if (tx_queue_stats_mappings[i].port_id == port_id) {
+	if (p_stats_map->tx_queue_stats_mapping_enabled) {
+		for (i = 0; i < p_stats_map->nb_txq_stats_mappings; i++) {
+			q_stats_map = &p_stats_map->txq_map_array[i];
+			if (q_stats_map->active) {
  				printf("  TX-queue %2d mapped to Stats Reg %2d\n",
-				       tx_queue_stats_mappings[i].queue_id,
-				       tx_queue_stats_mappings[i].stats_counter_id);
+				       q_stats_map->queue_id,
+				       q_stats_map->stats_counter_id);
  			}
  		}
  	}
@@ -4546,8 +4540,13 @@ tx_vlan_pvid_set(portid_t port_id, uint16_t 
vlan_id, int on)  void  set_qmap(portid_t port_id, uint8_t is_rx, 
uint16_t queue_id, uint8_t map_value)  {
+	struct port_stats_mappings *p_stats_map;
+	struct queue_stats_mappings *q_stats_map;
+	bool existing_mapping_found = false;
+	struct rte_port *port;
+	uint16_t cur_map_idx;
  	uint16_t i;
-	uint8_t existing_mapping_found = 0;
+	int ret;
   	if (port_id_is_invalid(port_id, ENABLED_WARN))
  		return;
@@ -4561,37 +4560,88 @@ set_qmap(portid_t port_id, uint8_t is_rx, 
uint16_t queue_id, uint8_t map_value)
  		return;
  	}
  -	if (!is_rx) { /*then tx*/
-		for (i = 0; i < nb_tx_queue_stats_mappings; i++) {
-			if ((tx_queue_stats_mappings[i].port_id == port_id) &&
-			    (tx_queue_stats_mappings[i].queue_id == queue_id)) {
-				tx_queue_stats_mappings[i].stats_counter_id = map_value;
-				existing_mapping_found = 1;
+	port = &ports[port_id];
+	p_stats_map = &port->p_stats_map;
+	if (!is_rx) { /* tx */
+		for (i = 0; i < p_stats_map->nb_txq_stats_mappings; i++) {
+			q_stats_map = &p_stats_map->txq_map_array[i];
+			if (q_stats_map->queue_id == queue_id) {
+				ret =
+				rte_eth_dev_set_tx_queue_stats_mapping(port_id,
+							queue_id, map_value);
+				if (ret) {
+					printf("failed to set tx queue stats "
+						"mapping.\n");
+					return;
+				}
+
+				q_stats_map->stats_counter_id = map_value;
+				q_stats_map->active = true;
+				existing_mapping_found = true;
  				break;
  			}
  		}
-		if (!existing_mapping_found) { /* A new additional mapping... */
-			tx_queue_stats_mappings[nb_tx_queue_stats_mappings].port_id = port_id;
-			tx_queue_stats_mappings[nb_tx_queue_stats_mappings].queue_id = queue_id;
-			tx_queue_stats_mappings[nb_tx_queue_stats_mappings].stats_counter_id 
= map_value;
-			nb_tx_queue_stats_mappings++;
+
+		/* A new additional mapping... */
+		if (!existing_mapping_found) {
+			ret = rte_eth_dev_set_tx_queue_stats_mapping(port_id,
+								     queue_id,
+								     map_value);
+			if (ret) {
+				printf("failed to set tx queue stats "
+					"mapping.\n");
+				return;
+			}
+
+			cur_map_idx = p_stats_map->nb_txq_stats_mappings;
+			q_stats_map = &p_stats_map->txq_map_array[cur_map_idx];
+			q_stats_map->queue_id = queue_id;
+			q_stats_map->stats_counter_id = map_value;
+			q_stats_map->active = true;
+			p_stats_map->nb_txq_stats_mappings++;
  		}
-	}
-	else { /*rx*/
-		for (i = 0; i < nb_rx_queue_stats_mappings; i++) {
-			if ((rx_queue_stats_mappings[i].port_id == port_id) &&
-			    (rx_queue_stats_mappings[i].queue_id == queue_id)) {
-				rx_queue_stats_mappings[i].stats_counter_id = map_value;
-				existing_mapping_found = 1;
+
+		p_stats_map->tx_queue_stats_mapping_enabled = true;
+	} else { /* rx */
+		for (i = 0; i < p_stats_map->nb_rxq_stats_mappings; i++) {
+			q_stats_map = &p_stats_map->rxq_map_array[i];
+			if (q_stats_map->queue_id == queue_id) {
+				ret =
+				rte_eth_dev_set_rx_queue_stats_mapping(port_id,
+							queue_id, map_value);
+				if (ret) {
+					printf("failed to set rx queue stats "
+						"mapping.\n");
+					return;
+				}
+
+				q_stats_map->stats_counter_id = map_value;
+				q_stats_map->active = true;
+				existing_mapping_found = true;
  				break;
  			}
  		}
-		if (!existing_mapping_found) { /* A new additional mapping... */
-			rx_queue_stats_mappings[nb_rx_queue_stats_mappings].port_id = port_id;
-			rx_queue_stats_mappings[nb_rx_queue_stats_mappings].queue_id = queue_id;
-			rx_queue_stats_mappings[nb_rx_queue_stats_mappings].stats_counter_id 
= map_value;
-			nb_rx_queue_stats_mappings++;
+
+		/* A new additional mapping... */
+		if (!existing_mapping_found) {
+			ret = rte_eth_dev_set_rx_queue_stats_mapping(port_id,
+								     queue_id,
+								     map_value);
+			if (ret) {
+				printf("failed to set rx queue stats "
+					"mapping.\n");
+				return;
+			}
+
+			cur_map_idx = p_stats_map->nb_rxq_stats_mappings;
+			q_stats_map = &p_stats_map->rxq_map_array[cur_map_idx];
+			q_stats_map->queue_id = queue_id;
+			q_stats_map->stats_counter_id = map_value;
+			q_stats_map->active = true;
+			p_stats_map->nb_rxq_stats_mappings++;
  		}
+
+		p_stats_map->rx_queue_stats_mapping_enabled = true;
  	}
  }
  diff --git a/app/test-pmd/parameters.c b/app/test-pmd/parameters.c 
index 5ae0cb6..ee2501b 100644
--- a/app/test-pmd/parameters.c
+++ b/app/test-pmd/parameters.c
@@ -300,7 +300,6 @@ parse_fwd_portmask(const char *portmask)
  		set_fwd_ports_mask((uint64_t) pm);
  }
  -
  static int
  parse_queue_stats_mapping_config(const char *q_arg, int is_rx)  { @@ 
-315,11 +314,13 @@ parse_queue_stats_mapping_config(const char *q_arg, 
int is_rx)
  	};
  	unsigned long int_fld[_NUM_FLD];
  	char *str_fld[_NUM_FLD];
+	struct rte_port *port;
  	int i;
  	unsigned size;
-
-	/* reset from value set at definition */
-	is_rx ? (nb_rx_queue_stats_mappings = 0) : (nb_tx_queue_stats_mappings 
= 0);
+	int port_id;
+	struct queue_stats_mappings *q_stats_map;
+	struct port_stats_mappings *p_stats_map;
+	uint16_t q_map_idx;
   	while ((p = strchr(p0,'(')) != NULL) {
  		++p;
@@ -346,44 +347,40 @@ parse_queue_stats_mapping_config(const char 
*q_arg, int is_rx)
  			return -1;
  		}
  +		port_id = (uint8_t)int_fld[FLD_PORT];
+		port = &ports[port_id];
+		p_stats_map = &port->p_stats_map;
  		if (!is_rx) {
-			if ((nb_tx_queue_stats_mappings >=
-						MAX_TX_QUEUE_STATS_MAPPINGS)) {
+			q_map_idx = p_stats_map->nb_txq_stats_mappings;
+			if (q_map_idx >= RTE_ETHDEV_QUEUE_STAT_CNTRS) {
  				printf("exceeded max number of TX queue "
-						"statistics mappings: %hu\n",
-						nb_tx_queue_stats_mappings);
+					"statistics mappings: %hu\n",
+					p_stats_map->nb_txq_stats_mappings);
  				return -1;
  			}
-			tx_queue_stats_mappings_array[nb_tx_queue_stats_mappings].port_id =
-				(uint8_t)int_fld[FLD_PORT];
-			tx_queue_stats_mappings_array[nb_tx_queue_stats_mappings].queue_id =
-				(uint8_t)int_fld[FLD_QUEUE];
-		 
tx_queue_stats_mappings_array[nb_tx_queue_stats_mappings].stats_counter_id =
-				(uint8_t)int_fld[FLD_STATS_COUNTER];
-			++nb_tx_queue_stats_mappings;
-		}
-		else {
-			if ((nb_rx_queue_stats_mappings >=
-						MAX_RX_QUEUE_STATS_MAPPINGS)) {
+			q_stats_map =
+				&p_stats_map->txq_map_array[q_map_idx];
+			q_stats_map->queue_id = int_fld[FLD_QUEUE];
+			q_stats_map->stats_counter_id =
+						int_fld[FLD_STATS_COUNTER];
+			++p_stats_map->nb_txq_stats_mappings;
+		} else {
+			q_map_idx = p_stats_map->nb_rxq_stats_mappings;
+			if (q_map_idx >= RTE_ETHDEV_QUEUE_STAT_CNTRS) {
  				printf("exceeded max number of RX queue "
-						"statistics mappings: %hu\n",
-						nb_rx_queue_stats_mappings);
+					"statistics mappings: %hu\n",
+					p_stats_map->nb_rxq_stats_mappings);
  				return -1;
  			}
-			rx_queue_stats_mappings_array[nb_rx_queue_stats_mappings].port_id =
-				(uint8_t)int_fld[FLD_PORT];
-			rx_queue_stats_mappings_array[nb_rx_queue_stats_mappings].queue_id =
-				(uint8_t)int_fld[FLD_QUEUE];
-		 
rx_queue_stats_mappings_array[nb_rx_queue_stats_mappings].stats_counter_id =
-				(uint8_t)int_fld[FLD_STATS_COUNTER];
-			++nb_rx_queue_stats_mappings;
+			q_stats_map =
+				&p_stats_map->rxq_map_array[q_map_idx];
+			q_stats_map->queue_id = int_fld[FLD_QUEUE];
+			q_stats_map->stats_counter_id =
+						int_fld[FLD_STATS_COUNTER];
+			++p_stats_map->nb_rxq_stats_mappings;
  		}
-
  	}
-/* Reassign the rx/tx_queue_stats_mappings pointer to point to this 
newly populated array rather */
-/* than to the default array (that was set at its definition) */
-	is_rx ? (rx_queue_stats_mappings = rx_queue_stats_mappings_array) :
-		(tx_queue_stats_mappings = tx_queue_stats_mappings_array);
+
  	return 0;
  }
  diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index 
94e3688..86e3271 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -476,15 +476,6 @@ struct rte_fdir_conf fdir_conf = {
   volatile int test_done = 1; /* stop packet forwarding when set to 1. */
  -struct queue_stats_mappings 
tx_queue_stats_mappings_array[MAX_TX_QUEUE_STATS_MAPPINGS];
-struct queue_stats_mappings 
rx_queue_stats_mappings_array[MAX_RX_QUEUE_STATS_MAPPINGS];
-
-struct queue_stats_mappings *tx_queue_stats_mappings = 
tx_queue_stats_mappings_array; -struct queue_stats_mappings 
*rx_queue_stats_mappings = rx_queue_stats_mappings_array;
-
-uint16_t nb_tx_queue_stats_mappings = 0; -uint16_t 
nb_rx_queue_stats_mappings = 0;
-
  /*
   * Display zero values by default for xstats
   */
@@ -1809,10 +1800,84 @@ fwd_stream_stats_display(streamid_t stream_id)  }
   void
+port_stats_mapping_display(portid_t pt_id, struct rte_eth_stats *stats) +{
+	struct port_stats_mappings *p_stats_map;
+	struct queue_stats_mappings *q_stats_map;
+	bool txq_stats_map_found = false;
+	bool rxq_stats_map_found = false;
+	uint16_t nb_txq_stats_map;
+	uint16_t nb_rxq_stats_map;
+	struct rte_port *port;
+	uint16_t i, j;
+
+	if (stats == NULL) {
+		printf("input stats address is null pointer.\n");
+		return;
+	}
+
+	if (port_id_is_invalid(pt_id, ENABLED_WARN)) {
+		print_valid_ports();
+		return;
+	}
+
+	port = &ports[pt_id];
+	p_stats_map = &port->p_stats_map;
+	if (p_stats_map->rx_queue_stats_mapping_enabled) {
+		printf("\n");
+		nb_rxq_stats_map = p_stats_map->nb_rxq_stats_mappings;
+		for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+			for (i = 0; i < nb_rxq_stats_map; i++) {
+				q_stats_map = &p_stats_map->rxq_map_array[i];
+				if (q_stats_map->stats_counter_id == j &&
+					q_stats_map->active) {
+					rxq_stats_map_found = true;
+					break;
+				}
+			}
+
+			if (rxq_stats_map_found) {
+				printf("  Stats reg %2d RX-packets:%14"PRIu64
+				       "    RX-errors: %14"PRIu64
+				       "    RX-bytes:%14"PRIu64"\n",
+				       j, stats->q_ipackets[j],
+				       stats->q_errors[j],
+				       stats->q_ibytes[j]);
+				rxq_stats_map_found = false;
+			}
+		}
+	}
+	if (p_stats_map->tx_queue_stats_mapping_enabled) {
+		printf("\n");
+		nb_txq_stats_map = p_stats_map->nb_txq_stats_mappings;
+		for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
+			for (i = 0; i < nb_txq_stats_map; i++) {
+				q_stats_map = &p_stats_map->txq_map_array[i];
+				if (q_stats_map->stats_counter_id == j &&
+					q_stats_map->active) {
+					txq_stats_map_found = true;
+					break;
+				}
+			}
+
+			if (txq_stats_map_found) {
+				printf("  Stats reg %2d TX-packets:%14"PRIu64
+				       "				 TX-bytes:%14"
+				       PRIu64"\n",
+				       j, stats->q_opackets[j],
+				       stats->q_obytes[j]);
+				txq_stats_map_found = false;
+			}
+		}
+	}
+}
+
+void
  fwd_stats_display(void)
  {
  	static const char *fwd_stats_border = "----------------------";
  	static const char *acc_stats_border = "+++++++++++++++";
+	struct port_stats_mappings *p_stats_map;
  	struct {
  		struct fwd_stream *rx_stream;
  		struct fwd_stream *tx_stream;
@@ -1857,8 +1922,6 @@ fwd_stats_display(void)
  			fwd_cycles += fs->core_cycles;
  	}
  	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
-		uint8_t j;
-
  		pt_id = fwd_ports_ids[i];
  		port = &ports[pt_id];
  @@ -1881,8 +1944,9 @@ fwd_stats_display(void)
  		printf("\n  %s Forward statistics for port %-2d %s\n",
  		       fwd_stats_border, pt_id, fwd_stats_border);
  -		if (!port->rx_queue_stats_mapping_enabled &&
-		    !port->tx_queue_stats_mapping_enabled) {
+		p_stats_map = &port->p_stats_map;
+		if (!p_stats_map->rx_queue_stats_mapping_enabled &&
+		    !p_stats_map->tx_queue_stats_mapping_enabled) {
  			printf("  RX-packets: %-14"PRIu64
  			       " RX-dropped: %-14"PRIu64
  			       "RX-total: %-"PRIu64"\n",
@@ -1944,26 +2008,7 @@ fwd_stats_display(void)
  					&ports_stats[pt_id].tx_stream->tx_burst_stats);
  		}
  -		if (port->rx_queue_stats_mapping_enabled) {
-			printf("\n");
-			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
-				printf("  Stats reg %2d RX-packets:%14"PRIu64
-				       "     RX-errors:%14"PRIu64
-				       "    RX-bytes:%14"PRIu64"\n",
-				       j, stats.q_ipackets[j],
-				       stats.q_errors[j], stats.q_ibytes[j]);
-			}
-			printf("\n");
-		}
-		if (port->tx_queue_stats_mapping_enabled) {
-			for (j = 0; j < RTE_ETHDEV_QUEUE_STAT_CNTRS; j++) {
-				printf("  Stats reg %2d TX-packets:%14"PRIu64
-				       "                                 TX-bytes:%14"
-				       PRIu64"\n",
-				       j, stats.q_opackets[j],
-				       stats.q_obytes[j]);
-			}
-		}
+		port_stats_mapping_display(pt_id, &stats);
   		printf("  %s--------------------------------%s\n",
  		       fwd_stats_border, fwd_stats_border); @@ -3355,59 +3400,84 @@ 
dev_event_callback(const char *device_name, enum rte_dev_event_type 
type,  static int  set_tx_queue_stats_mapping_registers(portid_t 
port_id, struct rte_port *port)  {
+	struct port_stats_mappings *p_stats_map;
+	struct queue_stats_mappings *q_stats_map;
+	bool mapping_found = false;
  	uint16_t i;
  	int diag;
-	uint8_t mapping_found = 0;
  -	for (i = 0; i < nb_tx_queue_stats_mappings; i++) {
-		if ((tx_queue_stats_mappings[i].port_id == port_id) &&
-				(tx_queue_stats_mappings[i].queue_id < nb_txq )) {
+	p_stats_map = &port->p_stats_map;
+	for (i = 0; i < p_stats_map->nb_txq_stats_mappings; i++) {
+		q_stats_map = &p_stats_map->txq_map_array[i];
+		if (q_stats_map->active) {
+			mapping_found = true;
+			continue;
+		}
+
+		if (q_stats_map->queue_id < nb_txq) {
  			diag = rte_eth_dev_set_tx_queue_stats_mapping(port_id,
-					tx_queue_stats_mappings[i].queue_id,
-					tx_queue_stats_mappings[i].stats_counter_id);
+					q_stats_map->queue_id,
+					q_stats_map->stats_counter_id);
  			if (diag != 0)
  				return diag;
-			mapping_found = 1;
+			q_stats_map->active = true;
+			mapping_found = true;
  		}
  	}
  	if (mapping_found)
-		port->tx_queue_stats_mapping_enabled = 1;
+		p_stats_map->tx_queue_stats_mapping_enabled = true;
+
  	return 0;
  }
   static int
  set_rx_queue_stats_mapping_registers(portid_t port_id, struct rte_port 
*port)  {
+	struct port_stats_mappings *p_stats_map;
+	struct queue_stats_mappings *q_stats_map;
+	bool mapping_found = false;
  	uint16_t i;
  	int diag;
-	uint8_t mapping_found = 0;
  -	for (i = 0; i < nb_rx_queue_stats_mappings; i++) {
-		if ((rx_queue_stats_mappings[i].port_id == port_id) &&
-				(rx_queue_stats_mappings[i].queue_id < nb_rxq )) {
+	p_stats_map = &port->p_stats_map;
+	for (i = 0; i < p_stats_map->nb_rxq_stats_mappings; i++) {
+		q_stats_map = &p_stats_map->rxq_map_array[i];
+		if (q_stats_map->active) {
+			mapping_found = true;
+			continue;
+		}
+
+		if (q_stats_map->queue_id < nb_rxq) {
  			diag = rte_eth_dev_set_rx_queue_stats_mapping(port_id,
-					rx_queue_stats_mappings[i].queue_id,
-					rx_queue_stats_mappings[i].stats_counter_id);
+					q_stats_map->queue_id,
+					q_stats_map->stats_counter_id);
  			if (diag != 0)
  				return diag;
-			mapping_found = 1;
+			q_stats_map->active = true;
+			mapping_found = true;
  		}
  	}
  	if (mapping_found)
-		port->rx_queue_stats_mapping_enabled = 1;
+		p_stats_map->rx_queue_stats_mapping_enabled = true;
+
  	return 0;
  }
   static void
  map_port_queue_stats_mapping_registers(portid_t pi, struct rte_port 
*port)  {
+	struct port_stats_mappings *p_stats_map = &port->p_stats_map;
  	int diag = 0;
   	diag = set_tx_queue_stats_mapping_registers(pi, port);
  	if (diag != 0) {
  		if (diag == -ENOTSUP) {
-			port->tx_queue_stats_mapping_enabled = 0;
-			printf("TX queue stats mapping not supported port id=%d\n", pi);
+			memset(p_stats_map->txq_map_array, 0,
+				sizeof(p_stats_map->txq_map_array));
+			p_stats_map->nb_txq_stats_mappings = 0;
+			p_stats_map->tx_queue_stats_mapping_enabled = false;
+			printf("TX queue stats mapping not supported "
+				"port id=%d\n", pi);
  		}
  		else
  			rte_exit(EXIT_FAILURE,
@@ -3419,8 +3489,12 @@ map_port_queue_stats_mapping_registers(portid_t 
pi, struct rte_port *port)
  	diag = set_rx_queue_stats_mapping_registers(pi, port);
  	if (diag != 0) {
  		if (diag == -ENOTSUP) {
-			port->rx_queue_stats_mapping_enabled = 0;
-			printf("RX queue stats mapping not supported port id=%d\n", pi);
+			memset(p_stats_map->rxq_map_array, 0,
+				sizeof(p_stats_map->rxq_map_array));
+			p_stats_map->nb_rxq_stats_mappings = 0;
+			p_stats_map->rx_queue_stats_mapping_enabled = false;
+			printf("RX queue stats mapping not supported "
+				"port id=%d\n", pi);
  		}
  		else
  			rte_exit(EXIT_FAILURE,
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 
833ca14..0397d6d 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -181,6 +181,24 @@ struct tunnel_ops {
  	uint32_t items:1;
  };
  +struct queue_stats_mappings {
+	uint16_t queue_id;
+	uint8_t stats_counter_id;
+	bool active;
+};
+
+/**
+ * The data of queue stats mapping on this port.
+ */
+struct port_stats_mappings {
+	struct queue_stats_mappings rxq_map_array[RTE_ETHDEV_QUEUE_STAT_CNTRS];
+	struct queue_stats_mappings txq_map_array[RTE_ETHDEV_QUEUE_STAT_CNTRS];
+	uint16_t nb_rxq_stats_mappings;
+	uint16_t nb_txq_stats_mappings;
+	bool rx_queue_stats_mapping_enabled;
+	bool tx_queue_stats_mapping_enabled;
+};
+
  /**
   * The data structure associated with each port.
   */
@@ -195,8 +213,7 @@ struct rte_port {
