{"id":806681,"url":"http://patchwork.ozlabs.org/api/1.0/patches/806681/?format=json","project":{"id":7,"url":"http://patchwork.ozlabs.org/api/1.0/projects/7/?format=json","name":"Linux network development","link_name":"netdev","list_id":"netdev.vger.kernel.org","list_email":"netdev@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<1503942035-24924-12-git-send-email-michael.chan@broadcom.com>","date":"2017-08-28T17:40:35","name":"[net-next,11/11] bnxt_en: add code to query TC flower offload stats","commit_ref":null,"pull_url":null,"state":"accepted","archived":true,"hash":"2dadbe40cd1094624c729128ca65e5e1f65a287c","submitter":{"id":68365,"url":"http://patchwork.ozlabs.org/api/1.0/people/68365/?format=json","name":"Michael Chan","email":"michael.chan@broadcom.com"},"delegate":{"id":34,"url":"http://patchwork.ozlabs.org/api/1.0/users/34/?format=json","username":"davem","first_name":"David","last_name":"Miller","email":"davem@davemloft.net"},"mbox":"http://patchwork.ozlabs.org/project/netdev/patch/1503942035-24924-12-git-send-email-michael.chan@broadcom.com/mbox/","series":[{"id":225,"url":"http://patchwork.ozlabs.org/api/1.0/series/225/?format=json","date":"2017-08-28T17:40:24","name":"bnxt_en: Updates.","version":1,"mbox":"http://patchwork.ozlabs.org/series/225/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/806681/checks/","tags":{},"headers":{"Return-Path":"<netdev-owner@vger.kernel.org>","X-Original-To":"patchwork-incoming@ozlabs.org","Delivered-To":"patchwork-incoming@ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","ozlabs.org; dkim=pass (1024-bit key;\n\tunprotected) header.d=broadcom.com header.i=@broadcom.com\n\theader.b=\"CUYowT5w\"; dkim-atps=neutral"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xgzZs1F7Vz9sMN\n\tfor <patchwork-incoming@ozlabs.org>;\n\tTue, 29 Aug 2017 03:41:09 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751660AbdH1RlH (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tMon, 28 Aug 2017 13:41:07 -0400","from mail-qk0-f171.google.com ([209.85.220.171]:34627 \"EHLO\n\tmail-qk0-f171.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751564AbdH1RlE (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Mon, 28 Aug 2017 13:41:04 -0400","by mail-qk0-f171.google.com with SMTP id a77so5390709qkb.1\n\tfor <netdev@vger.kernel.org>; Mon, 28 Aug 2017 10:41:04 -0700 (PDT)","from localhost.dhcp.broadcom.net ([192.19.255.250])\n\tby smtp.gmail.com with ESMTPSA id\n\t20sm592006qtu.52.2017.08.28.10.41.02\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tMon, 28 Aug 2017 10:41:03 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=broadcom.com; s=google;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=FGE4fZX2T3ONou7ZdGeauySZizcLuvmeMLRneu7CPzs=;\n\tb=CUYowT5wf+wnvHMVqrKTf4YKlfUseNakBTBsJoPrC8SkR0jvIfcDKFw9jQnKxNlTcT\n\t3whzIdtexTjCQZS7iIbVSiBsssj2lWnLzQbo5N9aUR9kDLhDrdp5wCyh5WcP9jYgeEFe\n\tqjLUbvYU13iYefPC9pFHPa9msj7CKu6DKOlNY=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=FGE4fZX2T3ONou7ZdGeauySZizcLuvmeMLRneu7CPzs=;\n\tb=bHq3+z/lb0VpTvVoMsD4Pmdtp/24zYjsFopwPIiK+wY2Lw807zwpWsoVAsBAYTcqJe\n\tGamIV3Jo/hVYuh2A+irWR9NzL6Pe1wZQtc7qzvZY7JFHNCbUa0JI0f/BStPtSSwKUcgn\n\tCE+2C44LeQwK1q1sTyPbQ9aXudLTWByOAxMiEhURv8VpT9EPowmkX9Tz2rWXVrLSgTCV\n\tw/22K/mnssMgcKhqujiX9So38IzwUAKWY+nZixEmYWfZbLmtlJrYt82T7g55nTbFcM4o\n\tlLqL5R09Mb46SG8iZgm5GUQ/jMdZVhx9vHc/oXGMUg/qJ0sB2O+6s+/BjPHKq/m993io\n\t/fgw==","X-Gm-Message-State":"AHYfb5jyK+qfl6pYFOqft7tZrx7fSDjmMpfz8bxSvA89RqRFLS7I3nyn\n\tRXGQs/9qPKjNRiVA","X-Received":"by 10.233.232.73 with SMTP id a70mr1794540qkg.287.1503942063728; \n\tMon, 28 Aug 2017 10:41:03 -0700 (PDT)","From":"Michael Chan <michael.chan@broadcom.com>","To":"davem@davemloft.net","Cc":"netdev@vger.kernel.org, Sathya Perla <sathya.perla@broadcom.com>","Subject":"[PATCH net-next 11/11] bnxt_en: add code to query TC flower offload\n\tstats","Date":"Mon, 28 Aug 2017 13:40:35 -0400","Message-Id":"<1503942035-24924-12-git-send-email-michael.chan@broadcom.com>","X-Mailer":"git-send-email 1.8.3.1","In-Reply-To":"<1503942035-24924-1-git-send-email-michael.chan@broadcom.com>","References":"<1503942035-24924-1-git-send-email-michael.chan@broadcom.com>","Sender":"netdev-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<netdev.vger.kernel.org>","X-Mailing-List":"netdev@vger.kernel.org"},"content":"From: Sathya Perla <sathya.perla@broadcom.com>\n\nThis patch adds code to implement TC_CLSFLOWER_STATS TC-cmd and the\nrequired FW code to query the stats from the HW.\n\nSigned-off-by: Sathya Perla <sathya.perla@broadcom.com>\nSigned-off-by: Michael Chan <michael.chan@broadcom.com>\n---\n drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c | 95 ++++++++++++++++++++++++++++\n 1 file changed, 95 insertions(+)","diff":"diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c\nindex 5fa0835..ccd699f 100644\n--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c\n+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c\n@@ -405,6 +405,81 @@ static int bnxt_hwrm_cfa_flow_alloc(struct bnxt *bp, struct bnxt_tc_flow *flow,\n \treturn rc;\n }\n \n+/* Add val to accum while handling a possible wraparound\n+ * of val. Eventhough val is of type u64, its actual width\n+ * is denoted by mask and will wrap-around beyond that width.\n+ */\n+static void accumulate_val(u64 *accum, u64 val, u64 mask)\n+{\n+#define low_bits(x, mask)\t\t((x) & (mask))\n+#define high_bits(x, mask)\t\t((x) & ~(mask))\n+\tbool wrapped = val < low_bits(*accum, mask);\n+\n+\t*accum = high_bits(*accum, mask) + val;\n+\tif (wrapped)\n+\t\t*accum += (mask + 1);\n+}\n+\n+/* The HW counters' width is much less than 64bits.\n+ * Handle possible wrap-around while updating the stat counters\n+ */\n+static void bnxt_flow_stats_fix_wraparound(struct bnxt_tc_info *tc_info,\n+\t\t\t\t\t   struct bnxt_tc_flow_stats *stats,\n+\t\t\t\t\t   struct bnxt_tc_flow_stats *hw_stats)\n+{\n+\taccumulate_val(&stats->bytes, hw_stats->bytes, tc_info->bytes_mask);\n+\taccumulate_val(&stats->packets, hw_stats->packets,\n+\t\t       tc_info->packets_mask);\n+}\n+\n+/* Fix possible wraparound of the stats queried from HW, calculate\n+ * the delta from prev_stats, and also update the prev_stats.\n+ * The HW flow stats are fetched under the hwrm_cmd_lock mutex.\n+ * This routine is best called while under the mutex so that the\n+ * stats processing happens atomically.\n+ */\n+static void bnxt_flow_stats_calc(struct bnxt_tc_info *tc_info,\n+\t\t\t\t struct bnxt_tc_flow *flow,\n+\t\t\t\t struct bnxt_tc_flow_stats *stats)\n+{\n+\tstruct bnxt_tc_flow_stats *acc_stats, *prev_stats;\n+\n+\tacc_stats = &flow->stats;\n+\tbnxt_flow_stats_fix_wraparound(tc_info, acc_stats, stats);\n+\n+\tprev_stats = &flow->prev_stats;\n+\tstats->bytes = acc_stats->bytes - prev_stats->bytes;\n+\tstats->packets = acc_stats->packets - prev_stats->packets;\n+\t*prev_stats = *acc_stats;\n+}\n+\n+static int bnxt_hwrm_cfa_flow_stats_get(struct bnxt *bp,\n+\t\t\t\t\t__le16 flow_handle,\n+\t\t\t\t\tstruct bnxt_tc_flow *flow,\n+\t\t\t\t\tstruct bnxt_tc_flow_stats *stats)\n+{\n+\tstruct hwrm_cfa_flow_stats_output *resp = bp->hwrm_cmd_resp_addr;\n+\tstruct hwrm_cfa_flow_stats_input req = { 0 };\n+\tint rc;\n+\n+\tbnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_FLOW_STATS, -1, -1);\n+\treq.num_flows = cpu_to_le16(1);\n+\treq.flow_handle_0 = flow_handle;\n+\n+\tmutex_lock(&bp->hwrm_cmd_lock);\n+\trc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);\n+\tif (!rc) {\n+\t\tstats->packets = le64_to_cpu(resp->packet_0);\n+\t\tstats->bytes = le64_to_cpu(resp->byte_0);\n+\t\tbnxt_flow_stats_calc(&bp->tc_info, flow, stats);\n+\t} else {\n+\t\tnetdev_info(bp->dev, \"error rc=%d\", rc);\n+\t}\n+\n+\tmutex_unlock(&bp->hwrm_cmd_lock);\n+\treturn rc;\n+}\n+\n static int bnxt_tc_put_l2_node(struct bnxt *bp,\n \t\t\t       struct bnxt_tc_flow_node *flow_node)\n {\n@@ -647,6 +722,26 @@ static int bnxt_tc_del_flow(struct bnxt *bp,\n static int bnxt_tc_get_flow_stats(struct bnxt *bp,\n \t\t\t\t  struct tc_cls_flower_offload *tc_flow_cmd)\n {\n+\tstruct bnxt_tc_info *tc_info = &bp->tc_info;\n+\tstruct bnxt_tc_flow_node *flow_node;\n+\tstruct bnxt_tc_flow_stats stats;\n+\tint rc;\n+\n+\tflow_node = rhashtable_lookup_fast(&tc_info->flow_table,\n+\t\t\t\t\t   &tc_flow_cmd->cookie,\n+\t\t\t\t\t   tc_info->flow_ht_params);\n+\tif (!flow_node) {\n+\t\tnetdev_info(bp->dev, \"Error: no flow_node for cookie %lx\",\n+\t\t\t    tc_flow_cmd->cookie);\n+\t\treturn -1;\n+\t}\n+\n+\trc = bnxt_hwrm_cfa_flow_stats_get(bp, flow_node->flow_handle,\n+\t\t\t\t\t  &flow_node->flow, &stats);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\ttcf_exts_stats_update(tc_flow_cmd->exts, stats.bytes, stats.packets, 0);\n \treturn 0;\n }\n \n","prefixes":["net-next","11/11"]}