From: Ben Hutchings <bhutchings@solarflare.com>
To: <netdev@vger.kernel.org>
Cc: <linux-net-drivers@solarflare.com>,
Alexander Duyck <alexander.h.duyck@intel.com>
Subject: [PATCH ethtool 18/21] rxclass: Replace global rmgr with automatic variable/parameter
Date: Tue, 1 Nov 2011 23:22:00 +0000 [thread overview]
Message-ID: <1320189720.2758.49.camel@bwh-desktop> (raw)
In-Reply-To: <1320186901.2758.30.camel@bwh-desktop>
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
rxclass.c | 78 ++++++++++++++++++++++++++----------------------------------
1 files changed, 34 insertions(+), 44 deletions(-)
diff --git a/rxclass.c b/rxclass.c
index 0c7b916..3b23a33 100644
--- a/rxclass.c
+++ b/rxclass.c
@@ -299,30 +299,28 @@ struct rmgr_ctrl {
__u32 size;
};
-static struct rmgr_ctrl rmgr;
-static int rmgr_init_done = 0;
-
-static int rmgr_ins(__u32 loc)
+static int rmgr_ins(struct rmgr_ctrl *rmgr, __u32 loc)
{
/* verify location is in rule manager range */
- if (loc >= rmgr.size) {
+ if (loc >= rmgr->size) {
fprintf(stderr, "rmgr: Location out of range\n");
return -1;
}
/* set bit for the rule */
- set_bit(loc, rmgr.slot);
+ set_bit(loc, rmgr->slot);
return 0;
}
-static int rmgr_find_empty_slot(struct ethtool_rx_flow_spec *fsp)
+static int rmgr_find_empty_slot(struct rmgr_ctrl *rmgr,
+ struct ethtool_rx_flow_spec *fsp)
{
__u32 loc;
__u32 slot_num;
/* start at the end of the list since it is lowest priority */
- loc = rmgr.size - 1;
+ loc = rmgr->size - 1;
/* locate the first slot a rule can be placed in */
slot_num = loc / BITS_PER_LONG;
@@ -333,10 +331,10 @@ static int rmgr_find_empty_slot(struct ethtool_rx_flow_spec *fsp)
* moving 1 + loc % BITS_PER_LONG we align ourselves to the last bit
* in the previous word.
*
- * If loc rolls over it should be greater than or equal to rmgr.size
+ * If loc rolls over it should be greater than or equal to rmgr->size
* and as such we know we have reached the end of the list.
*/
- if (!~(rmgr.slot[slot_num] | (~1UL << rmgr.size % BITS_PER_LONG))) {
+ if (!~(rmgr->slot[slot_num] | (~1UL << rmgr->size % BITS_PER_LONG))) {
loc -= 1 + (loc % BITS_PER_LONG);
slot_num--;
}
@@ -345,7 +343,7 @@ static int rmgr_find_empty_slot(struct ethtool_rx_flow_spec *fsp)
* Now that we are aligned with the last bit in each long we can just
* go though and eliminate all the longs with no free bits
*/
- while (loc < rmgr.size && !~(rmgr.slot[slot_num])) {
+ while (loc < rmgr->size && !~(rmgr->slot[slot_num])) {
loc -= BITS_PER_LONG;
slot_num--;
}
@@ -354,13 +352,13 @@ static int rmgr_find_empty_slot(struct ethtool_rx_flow_spec *fsp)
* If we still are inside the range, test individual bits as one is
* likely available for our use.
*/
- while (loc < rmgr.size && test_bit(loc, rmgr.slot))
+ while (loc < rmgr->size && test_bit(loc, rmgr->slot))
loc--;
/* location found, insert rule */
- if (loc < rmgr.size) {
+ if (loc < rmgr->size) {
fsp->location = loc;
- return rmgr_ins(loc);
+ return rmgr_ins(rmgr, loc);
}
/* No space to add this rule */
@@ -369,25 +367,22 @@ static int rmgr_find_empty_slot(struct ethtool_rx_flow_spec *fsp)
return -1;
}
-static int rmgr_init(struct cmd_context *ctx)
+static int rmgr_init(struct cmd_context *ctx, struct rmgr_ctrl *rmgr)
{
struct ethtool_rxnfc *nfccmd;
int err, i;
__u32 *rule_locs;
- if (rmgr_init_done)
- return 0;
-
/* clear rule manager settings */
- memset(&rmgr, 0, sizeof(struct rmgr_ctrl));
+ memset(rmgr, 0, sizeof(*rmgr));
- /* request count and store in rmgr.n_rules */
- err = rxclass_get_count(ctx, &rmgr.n_rules);
+ /* request count and store in rmgr->n_rules */
+ err = rxclass_get_count(ctx, &rmgr->n_rules);
if (err < 0)
return err;
/* alloc memory for request of location list */
- nfccmd = calloc(1, sizeof(*nfccmd) + (rmgr.n_rules * sizeof(__u32)));
+ nfccmd = calloc(1, sizeof(*nfccmd) + (rmgr->n_rules * sizeof(__u32)));
if (!nfccmd) {
perror("rmgr: Cannot allocate memory for"
" RX class rule locations");
@@ -396,7 +391,7 @@ static int rmgr_init(struct cmd_context *ctx)
/* request location list */
nfccmd->cmd = ETHTOOL_GRXCLSRLALL;
- nfccmd->rule_cnt = rmgr.n_rules;
+ nfccmd->rule_cnt = rmgr->n_rules;
err = send_ioctl(ctx, nfccmd);
if (err < 0) {
perror("rmgr: Cannot get RX class rules");
@@ -405,61 +400,56 @@ static int rmgr_init(struct cmd_context *ctx)
}
/* make certain the table size is valid */
- rmgr.size = nfccmd->data;
- if (rmgr.size == 0 || rmgr.size < rmgr.n_rules) {
+ rmgr->size = nfccmd->data;
+ if (rmgr->size == 0 || rmgr->size < rmgr->n_rules) {
perror("rmgr: Invalid RX class rules table size");
return -1;
}
/* initialize bitmap for storage of valid locations */
- rmgr.slot = calloc(1, BITS_TO_LONGS(rmgr.size) * sizeof(long));
- if (!rmgr.slot) {
+ rmgr->slot = calloc(1, BITS_TO_LONGS(rmgr->size) * sizeof(long));
+ if (!rmgr->slot) {
perror("rmgr: Cannot allocate memory for RX class rules");
return -1;
}
/* write locations to bitmap */
rule_locs = nfccmd->rule_locs;
- for (i = 0; i < rmgr.n_rules; i++) {
- err = rmgr_ins(rule_locs[i]);
+ for (i = 0; i < rmgr->n_rules; i++) {
+ err = rmgr_ins(rmgr, rule_locs[i]);
if (err < 0)
break;
}
- /* free memory and set flag to avoid reinit */
free(nfccmd);
- rmgr_init_done = 1;
return err;
}
-static void rmgr_cleanup(void)
+static void rmgr_cleanup(struct rmgr_ctrl *rmgr)
{
- if (!rmgr_init_done)
- return;
-
- rmgr_init_done = 0;
-
- free(rmgr.slot);
- rmgr.slot = NULL;
- rmgr.size = 0;
+ free(rmgr->slot);
+ rmgr->slot = NULL;
+ rmgr->size = 0;
}
static int rmgr_set_location(struct cmd_context *ctx,
struct ethtool_rx_flow_spec *fsp)
{
+ struct rmgr_ctrl rmgr;
int err;
/* init table of available rules */
- err = rmgr_init(ctx);
+ err = rmgr_init(ctx, &rmgr);
if (err < 0)
- return err;
+ goto out;
/* verify rule location */
- err = rmgr_find_empty_slot(fsp);
+ err = rmgr_find_empty_slot(&rmgr, fsp);
+out:
/* cleanup table and free resources */
- rmgr_cleanup();
+ rmgr_cleanup(&rmgr);
return err;
}
--
1.7.4.4
--
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
next prev parent reply other threads:[~2011-11-01 23:22 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-01 22:35 [PATCH ethtool 00/21] ethtool refactoring and misc changes Ben Hutchings
2011-11-01 23:13 ` [PATCH ethtool 01/21] Report pause frame autonegotiation result Ben Hutchings
2011-11-01 23:13 ` [PATCH ethtool 02/21] ethtool.8: Fix initial blank line/page Ben Hutchings
2011-11-01 23:14 ` [PATCH ethtool 03/21] Combine ethtool-{bitops,util}.h into internal.h Ben Hutchings
2011-11-01 23:14 ` [PATCH ethtool 04/21] Fix type of bit-number parameter to set_bit() and clear_bit() Ben Hutchings
2011-11-01 23:15 ` [PATCH ethtool 05/21] ethtool.8: Change device name metavariable from 'ethX' to 'devname' Ben Hutchings
2011-11-01 23:15 ` [PATCH ethtool 06/21] ethtool.8: Allow line-break in description of parameters after -N Ben Hutchings
2011-11-01 23:15 ` [PATCH ethtool 07/21] Fix format of help text for -f option Ben Hutchings
2011-11-01 23:15 ` [PATCH ethtool 08/21] Use standard indentation for definition of struct option args Ben Hutchings
2011-11-01 23:16 ` [PATCH ethtool 09/21] Encapsulate command context in a structure Ben Hutchings
2011-11-01 23:17 ` [PATCH ethtool 10/21] Add test cases for command-line parsing Ben Hutchings
2011-11-01 23:17 ` [PATCH ethtool 11/21] Add more " Ben Hutchings
2011-11-01 23:18 ` [PATCH ethtool 12/21] Move argument parsing to sub-command functions Ben Hutchings
2011-11-01 23:18 ` [PATCH ethtool 13/21] Support arbitrary numbers of option names for each mode Ben Hutchings
2011-11-01 23:18 ` [PATCH ethtool 14/21] Fix reference to cmdline_ring in do_schannels() Ben Hutchings
2011-11-01 23:19 ` [PATCH ethtool 15/21] Convert cmdline_msglvl into array of named flags; convert back at run-time Ben Hutchings
2011-11-01 23:20 ` [PATCH ethtool 16/21] Replace global devname variable with a field in struct cmd_context Ben Hutchings
2011-11-01 23:21 ` [PATCH ethtool 17/21] Change most static global variables into automatic variables Ben Hutchings
2011-11-01 23:22 ` Ben Hutchings [this message]
2011-11-01 23:22 ` [PATCH ethtool 19/21] Declare static variables const as appropriate Ben Hutchings
2011-11-01 23:23 ` [PATCH ethtool 20/21] Run tests in-process Ben Hutchings
2011-11-02 20:25 ` Ben Hutchings
2011-11-01 23:24 ` [PATCH ethtool 21/21] Rearrange definitions and remove unnecessary forward declarations Ben Hutchings
2011-11-03 19:17 ` [PATCH ethtool 00/21] ethtool refactoring and misc changes Ben Hutchings
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1320189720.2758.49.camel@bwh-desktop \
--to=bhutchings@solarflare.com \
--cc=alexander.h.duyck@intel.com \
--cc=linux-net-drivers@solarflare.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.