wil6210: allow to handle Rx on 2 cores
authorVladimir Shulman <QCA_shulmanv@QCA.qualcomm.com>
Thu, 30 Jul 2015 10:52:04 +0000 (13:52 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 6 Aug 2015 06:43:50 +0000 (09:43 +0300)
Allow network stack part of Rx processing to run on separate core,
relaxing CPU utilization on the core used for Rx NAPI.

If RXHASH feature is enabled, the driver sets rxhash of each skb to 1
to enable RPS. The core for processing the rx skb is determined by RPS
mechanism according to rx_cpus bit mask which is configured at user level.
For processing skbs on different core from the core which processes
the interrupts, it is recommended not to enable core 0 in rx_cpus bit mask.

Signed-off-by: Vladimir Shulman <QCA_shulmanv@QCA.qualcomm.com>
Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/wil6210/netdev.c
drivers/net/wireless/ath/wil6210/txrx.c

index 25c51167adff1cb2173db9fd7101293409607c78..e3b3c8fb4605502a8c7cf80bbf12b1473a69388c 100644 (file)
@@ -174,7 +174,8 @@ void *wil_if_alloc(struct device *dev)
        ndev->ieee80211_ptr = wdev;
        ndev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
                            NETIF_F_SG | NETIF_F_GRO |
-                           NETIF_F_TSO | NETIF_F_TSO6;
+                           NETIF_F_TSO | NETIF_F_TSO6 |
+                           NETIF_F_RXHASH;
 
        ndev->features |= ndev->hw_features;
        SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy));
index 359121f1867496dc3de308709d5f9c0a0430411f..6229110d558a1a043566091859144b582c34c6c9 100644 (file)
@@ -541,6 +541,14 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev)
                [GRO_DROP]              = "GRO_DROP",
        };
 
+       if (ndev->features & NETIF_F_RXHASH)
+               /* fake L4 to ensure it won't be re-calculated later
+                * set hash to any non-zero value to activate rps
+                * mechanism, core will be chosen according
+                * to user-level rps configuration.
+                */
+               skb_set_hash(skb, 1, PKT_HASH_TYPE_L4);
+
        skb_orphan(skb);
 
        if (wdev->iftype == NL80211_IFTYPE_AP && !wil->ap_isolate) {