Blob Blame History Raw
From: Julian Wiedmann <jwi@linux.ibm.com>
Subject: s390/qeth: avoid using is_multicast_ether_addr_64bits on (u8 *)[6]
Patch-mainline: v4.18-rc4
Git-commit: 9d0a58fb9747afd27d490c02a97889a1b59f6be4
References: FATE#326350, LTC#169511, bsc#1113509

Summary:     qeth: performance improvements
Description: This adds recent functional and performance improvements for the
             qeth network driver.
             Primarily this brings Scatter-Gather support for HiperSockets,
             reduced CPU consumption in the L3 IPv4 transmit path for OSA,
             improved Promiscuous Mode performance due to IFF_UNICAST_FLT,
             support for Scatter-Gather on z/VM virtual NICs, and
             support for delayed GRO flushing.

             For sanity & stability reasons, this effectively constitutes a
             backport of the qeth device driver from 4.19 mainline.
             

Upstream-Description:

             s390/qeth: avoid using is_multicast_ether_addr_64bits on (u8 *)[6]

             *ether_addr*_64bits functions have been introduced to optimize
             performance critical paths, which access 6-byte ethernet address as u64
             value to get "nice" assembly. A harmless hack works nicely on ethernet
             addresses shoved into a structure or a larger buffer, until busted by
             Kasan on smth like plain (u8 *)[6].

             qeth_l2_set_mac_address calls qeth_l2_remove_mac passing
             u8 old_addr[ETH_ALEN] as an argument.

             Adding/removing macs for an ethernet adapter is not that performance
             critical. Moreover is_multicast_ether_addr_64bits itself on s390 is not
             faster than is_multicast_ether_addr:

             is_multicast_ether_addr(%r2) -> %r2
             llc	%r2,0(%r2)
             risbg	%r2,%r2,63,191,0

             is_multicast_ether_addr_64bits(%r2) -> %r2
             llgc	%r2,0(%r2)
             risbg	%r2,%r2,63,191,0

             So, let's just use is_multicast_ether_addr instead of
             is_multicast_ether_addr_64bits.

             Fixes: bcacfcbc82b4 ("s390/qeth: fix MAC address update sequence")
             Reviewed-by: Julian Wiedmann <jwi@linux.ibm.com>
             Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
             Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
             Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 drivers/s390/net/qeth_l2_main.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -140,7 +140,7 @@ static int qeth_l2_send_setmac(struct qe
 
 static int qeth_l2_write_mac(struct qeth_card *card, u8 *mac)
 {
-	enum qeth_ipa_cmds cmd = is_multicast_ether_addr_64bits(mac) ?
+	enum qeth_ipa_cmds cmd = is_multicast_ether_addr(mac) ?
 					IPA_CMD_SETGMAC : IPA_CMD_SETVMAC;
 	int rc;
 
@@ -157,7 +157,7 @@ static int qeth_l2_write_mac(struct qeth
 
 static int qeth_l2_remove_mac(struct qeth_card *card, u8 *mac)
 {
-	enum qeth_ipa_cmds cmd = is_multicast_ether_addr_64bits(mac) ?
+	enum qeth_ipa_cmds cmd = is_multicast_ether_addr(mac) ?
 					IPA_CMD_DELGMAC : IPA_CMD_DELVMAC;
 	int rc;