* [PATCH 00/10] staging: Clean up ozwpan driver
@ 2014-08-04 12:54 Christoph Jaeger
2014-08-04 12:54 ` [PATCH 01/10] staging: ozwpan: Add module parameter description Christoph Jaeger
` (9 more replies)
0 siblings, 10 replies; 17+ messages in thread
From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw)
To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger
This patch set does some cleanup; no functional change.
Christoph Jaeger (10):
staging: ozwpan: Add module parameter description
staging: ozwpan: Fix typo in typedef
staging: ozwpan: Remove unused OZ_MAX_TIMER_POOL_SIZE
staging: ozwpan: Remove redundant initialization
staging: ozwpan: Remove dead code
staging: ozwpan: Simplify app interface
staging: ozwpan: Use slab cache for oz_urb_link allocation
staging: ozwpan: Use slab cache for oz_elt_info allocation
staging: ozwpan: Use slab cache for oz_tx_frame allocation
staging: ozwpan: Use list helpers
drivers/staging/ozwpan/ozcdev.c | 31 ++--
drivers/staging/ozwpan/ozeltbuf.c | 131 +++------------
drivers/staging/ozwpan/ozeltbuf.h | 7 +-
drivers/staging/ozwpan/ozhcd.c | 166 +++++--------------
drivers/staging/ozwpan/ozmain.c | 4 +-
drivers/staging/ozwpan/ozpd.c | 307 ++++++++++--------------------------
drivers/staging/ozwpan/ozpd.h | 9 +-
drivers/staging/ozwpan/ozproto.c | 36 +++--
drivers/staging/ozwpan/ozproto.h | 8 +-
drivers/staging/ozwpan/ozprotocol.h | 2 -
drivers/staging/ozwpan/ozusbsvc.c | 30 ++--
drivers/staging/ozwpan/ozusbsvc1.c | 12 +-
12 files changed, 223 insertions(+), 520 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 17+ messages in thread* [PATCH 01/10] staging: ozwpan: Add module parameter description 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-04 12:54 ` [PATCH 02/10] staging: ozwpan: Fix typo in typedef Christoph Jaeger ` (8 subsequent siblings) 9 siblings, 0 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozmain.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/staging/ozwpan/ozmain.c b/drivers/staging/ozwpan/ozmain.c index d1a5b7a..7d6ef4c 100644 --- a/drivers/staging/ozwpan/ozmain.c +++ b/drivers/staging/ozwpan/ozmain.c @@ -25,6 +25,9 @@ unsigned int oz_dbg_mask = OZ_DEFAULT_DBG_MASK; * netcards. Bindings can be added later using an IOCTL. */ static char *g_net_dev = ""; +module_param(g_net_dev, charp, S_IRUGO); +MODULE_PARM_DESC(g_net_dev, "The device(s) to bind to; " + "'*' means all, '' (empty string; default) means none."); /* * Context: process @@ -48,7 +51,6 @@ static void __exit ozwpan_exit(void) oz_cdev_deregister(); } -module_param(g_net_dev, charp, S_IRUGO); module_init(ozwpan_init); module_exit(ozwpan_exit); -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 02/10] staging: ozwpan: Fix typo in typedef 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger 2014-08-04 12:54 ` [PATCH 01/10] staging: ozwpan: Add module parameter description Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-10 4:42 ` Greg KH 2014-08-04 12:54 ` [PATCH 03/10] staging: ozwpan: Remove unused OZ_MAX_TIMER_POOL_SIZE Christoph Jaeger ` (7 subsequent siblings) 9 siblings, 1 reply; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozproto.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/staging/ozwpan/ozproto.h b/drivers/staging/ozwpan/ozproto.h index cb38e02..378b737 100644 --- a/drivers/staging/ozwpan/ozproto.h +++ b/drivers/staging/ozwpan/ozproto.h @@ -34,7 +34,7 @@ typedef void (*oz_app_term_fn_t)(void); typedef int (*oz_app_start_fn_t)(struct oz_pd *pd, int resume); typedef void (*oz_app_stop_fn_t)(struct oz_pd *pd, int pause); typedef void (*oz_app_rx_fn_t)(struct oz_pd *pd, struct oz_elt *elt); -typedef int (*oz_app_hearbeat_fn_t)(struct oz_pd *pd); +typedef int (*oz_app_heartbeat_fn_t)(struct oz_pd *pd); typedef void (*oz_app_farewell_fn_t)(struct oz_pd *pd, u8 ep_num, u8 *data, u8 len); @@ -44,7 +44,7 @@ struct oz_app_if { oz_app_start_fn_t start; oz_app_stop_fn_t stop; oz_app_rx_fn_t rx; - oz_app_hearbeat_fn_t heartbeat; + oz_app_heartbeat_fn_t heartbeat; oz_app_farewell_fn_t farewell; int app_id; }; -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 02/10] staging: ozwpan: Fix typo in typedef 2014-08-04 12:54 ` [PATCH 02/10] staging: ozwpan: Fix typo in typedef Christoph Jaeger @ 2014-08-10 4:42 ` Greg KH 0 siblings, 0 replies; 17+ messages in thread From: Greg KH @ 2014-08-10 4:42 UTC (permalink / raw) To: Christoph Jaeger; +Cc: shigekatsu.tateno, devel, linux-kernel On Mon, Aug 04, 2014 at 02:54:48PM +0200, Christoph Jaeger wrote: > Signed-off-by: Christoph Jaeger <email@christophjaeger.info> > --- > drivers/staging/ozwpan/ozproto.h | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/staging/ozwpan/ozproto.h b/drivers/staging/ozwpan/ozproto.h > index cb38e02..378b737 100644 > --- a/drivers/staging/ozwpan/ozproto.h > +++ b/drivers/staging/ozwpan/ozproto.h > @@ -34,7 +34,7 @@ typedef void (*oz_app_term_fn_t)(void); > typedef int (*oz_app_start_fn_t)(struct oz_pd *pd, int resume); > typedef void (*oz_app_stop_fn_t)(struct oz_pd *pd, int pause); > typedef void (*oz_app_rx_fn_t)(struct oz_pd *pd, struct oz_elt *elt); > -typedef int (*oz_app_hearbeat_fn_t)(struct oz_pd *pd); > +typedef int (*oz_app_heartbeat_fn_t)(struct oz_pd *pd); > typedef void (*oz_app_farewell_fn_t)(struct oz_pd *pd, u8 ep_num, > u8 *data, u8 len); > > @@ -44,7 +44,7 @@ struct oz_app_if { > oz_app_start_fn_t start; > oz_app_stop_fn_t stop; > oz_app_rx_fn_t rx; > - oz_app_hearbeat_fn_t heartbeat; > + oz_app_heartbeat_fn_t heartbeat; > oz_app_farewell_fn_t farewell; > int app_id; > }; As these typedefs are only used in this one structure, there's no real need for them, you can remove them in a later patch if you want. thanks, greg k-h ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 03/10] staging: ozwpan: Remove unused OZ_MAX_TIMER_POOL_SIZE 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger 2014-08-04 12:54 ` [PATCH 01/10] staging: ozwpan: Add module parameter description Christoph Jaeger 2014-08-04 12:54 ` [PATCH 02/10] staging: ozwpan: Fix typo in typedef Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-04 12:54 ` [PATCH 04/10] staging: ozwpan: Remove redundant initialization Christoph Jaeger ` (6 subsequent siblings) 9 siblings, 0 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger OZ_MAX_TIMER_POOL_SIZE is not used anywhere; remove it. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozproto.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c index 1102055..4aebe16 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -29,8 +29,6 @@ #define OZ_DO_STOP 1 #define OZ_DO_SLEEP 2 -#define OZ_MAX_TIMER_POOL_SIZE 16 - struct oz_binding { struct packet_type ptype; char name[OZ_MAX_BINDING_LEN]; -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 04/10] staging: ozwpan: Remove redundant initialization 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger ` (2 preceding siblings ...) 2014-08-04 12:54 ` [PATCH 03/10] staging: ozwpan: Remove unused OZ_MAX_TIMER_POOL_SIZE Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-04 12:54 ` [PATCH 05/10] staging: ozwpan: Remove dead code Christoph Jaeger ` (5 subsequent siblings) 9 siblings, 0 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Member 'ops' has already been initialized by calling cdev_init(). Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozcdev.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/staging/ozwpan/ozcdev.c b/drivers/staging/ozwpan/ozcdev.c index 10c0a96..f82e12c 100644 --- a/drivers/staging/ozwpan/ozcdev.c +++ b/drivers/staging/ozwpan/ozcdev.c @@ -360,7 +360,6 @@ int oz_cdev_register(void) MAJOR(g_cdev.devnum), MINOR(g_cdev.devnum)); cdev_init(&g_cdev.cdev, &oz_fops); g_cdev.cdev.owner = THIS_MODULE; - g_cdev.cdev.ops = &oz_fops; spin_lock_init(&g_cdev.lock); init_waitqueue_head(&g_cdev.rdq); err = cdev_add(&g_cdev.cdev, g_cdev.devnum, 1); -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 05/10] staging: ozwpan: Remove dead code 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger ` (3 preceding siblings ...) 2014-08-04 12:54 ` [PATCH 04/10] staging: ozwpan: Remove redundant initialization Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-04 12:54 ` [PATCH 06/10] staging: ozwpan: Simplify app interface Christoph Jaeger ` (4 subsequent siblings) 9 siblings, 0 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger No need to return a value from elt_buf_init(). Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozeltbuf.c | 3 +-- drivers/staging/ozwpan/ozeltbuf.h | 2 +- drivers/staging/ozwpan/ozpd.c | 5 +---- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/drivers/staging/ozwpan/ozeltbuf.c b/drivers/staging/ozwpan/ozeltbuf.c index bd560c6..f6e6481 100644 --- a/drivers/staging/ozwpan/ozeltbuf.c +++ b/drivers/staging/ozwpan/ozeltbuf.c @@ -16,7 +16,7 @@ /* * Context: softirq-serialized */ -int oz_elt_buf_init(struct oz_elt_buf *buf) +void oz_elt_buf_init(struct oz_elt_buf *buf) { memset(buf, 0, sizeof(struct oz_elt_buf)); INIT_LIST_HEAD(&buf->stream_list); @@ -24,7 +24,6 @@ int oz_elt_buf_init(struct oz_elt_buf *buf) INIT_LIST_HEAD(&buf->isoc_list); buf->max_free_elts = 32; spin_lock_init(&buf->lock); - return 0; } /* diff --git a/drivers/staging/ozwpan/ozeltbuf.h b/drivers/staging/ozwpan/ozeltbuf.h index 03c12f5..3846432 100644 --- a/drivers/staging/ozwpan/ozeltbuf.h +++ b/drivers/staging/ozwpan/ozeltbuf.h @@ -50,7 +50,7 @@ struct oz_elt_buf { u8 tx_seq_num[OZ_NB_APPS]; }; -int oz_elt_buf_init(struct oz_elt_buf *buf); +void oz_elt_buf_init(struct oz_elt_buf *buf); void oz_elt_buf_term(struct oz_elt_buf *buf); struct oz_elt_info *oz_elt_info_alloc(struct oz_elt_buf *buf); void oz_elt_info_free(struct oz_elt_buf *buf, struct oz_elt_info *ei); diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index 10f1b3a..a27c603 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -175,10 +175,7 @@ struct oz_pd *oz_pd_alloc(const u8 *mac_addr) oz_pd_set_state(pd, OZ_PD_S_IDLE); pd->max_tx_size = OZ_MAX_TX_SIZE; ether_addr_copy(pd->mac_addr, mac_addr); - if (0 != oz_elt_buf_init(&pd->elt_buff)) { - kfree(pd); - pd = NULL; - } + oz_elt_buf_init(&pd->elt_buff); spin_lock_init(&pd->tx_frame_lock); INIT_LIST_HEAD(&pd->tx_queue); INIT_LIST_HEAD(&pd->farewell_list); -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 06/10] staging: ozwpan: Simplify app interface 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger ` (4 preceding siblings ...) 2014-08-04 12:54 ` [PATCH 05/10] staging: ozwpan: Remove dead code Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-05 11:13 ` Dan Carpenter 2014-08-04 12:54 ` [PATCH 07/10] staging: ozwpan: Use slab cache for oz_urb_link allocation Christoph Jaeger ` (3 subsequent siblings) 9 siblings, 1 reply; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Simplify the somewhat overcomplicated application interface; improves readability and saves a bunch of lines. Use designated struct initializers for clarity. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozcdev.c | 30 +++---- drivers/staging/ozwpan/ozpd.c | 151 ++++++++++-------------------------- drivers/staging/ozwpan/ozpd.h | 4 +- drivers/staging/ozwpan/ozproto.c | 2 +- drivers/staging/ozwpan/ozproto.h | 1 - drivers/staging/ozwpan/ozprotocol.h | 2 - drivers/staging/ozwpan/ozusbsvc.c | 30 +++---- drivers/staging/ozwpan/ozusbsvc1.c | 12 +-- 8 files changed, 82 insertions(+), 150 deletions(-) diff --git a/drivers/staging/ozwpan/ozcdev.c b/drivers/staging/ozwpan/ozcdev.c index f82e12c..c73d396 100644 --- a/drivers/staging/ozwpan/ozcdev.c +++ b/drivers/staging/ozwpan/ozcdev.c @@ -49,11 +49,11 @@ static struct oz_serial_ctx *oz_cdev_claim_ctx(struct oz_pd *pd) { struct oz_serial_ctx *ctx; - spin_lock_bh(&pd->app_lock[OZ_APPID_SERIAL-1]); - ctx = (struct oz_serial_ctx *)pd->app_ctx[OZ_APPID_SERIAL-1]; + spin_lock_bh(&pd->app_lock[OZ_APPID_SERIAL]); + ctx = (struct oz_serial_ctx *) pd->app_ctx[OZ_APPID_SERIAL]; if (ctx) atomic_inc(&ctx->ref_count); - spin_unlock_bh(&pd->app_lock[OZ_APPID_SERIAL-1]); + spin_unlock_bh(&pd->app_lock[OZ_APPID_SERIAL]); return ctx; } @@ -182,8 +182,8 @@ static ssize_t oz_cdev_write(struct file *filp, const char __user *buf, app_hdr->app_id = OZ_APPID_SERIAL; if (copy_from_user(app_hdr+1, buf, count)) goto out; - spin_lock_bh(&pd->app_lock[OZ_APPID_USB-1]); - ctx = (struct oz_serial_ctx *)pd->app_ctx[OZ_APPID_SERIAL-1]; + spin_lock_bh(&pd->app_lock[OZ_APPID_USB]); + ctx = (struct oz_serial_ctx *) pd->app_ctx[OZ_APPID_SERIAL]; if (ctx) { app_hdr->elt_seq_num = ctx->tx_seq_num++; if (ctx->tx_seq_num == 0) @@ -193,7 +193,7 @@ static ssize_t oz_cdev_write(struct file *filp, const char __user *buf, ei = NULL; spin_unlock(&eb->lock); } - spin_unlock_bh(&pd->app_lock[OZ_APPID_USB-1]); + spin_unlock_bh(&pd->app_lock[OZ_APPID_USB]); out: if (ei) { count = 0; @@ -436,14 +436,14 @@ int oz_cdev_start(struct oz_pd *pd, int resume) return -ENOMEM; atomic_set(&ctx->ref_count, 1); ctx->tx_seq_num = 1; - spin_lock_bh(&pd->app_lock[OZ_APPID_SERIAL-1]); - old_ctx = pd->app_ctx[OZ_APPID_SERIAL-1]; + spin_lock_bh(&pd->app_lock[OZ_APPID_SERIAL]); + old_ctx = pd->app_ctx[OZ_APPID_SERIAL]; if (old_ctx) { - spin_unlock_bh(&pd->app_lock[OZ_APPID_SERIAL-1]); + spin_unlock_bh(&pd->app_lock[OZ_APPID_SERIAL]); kfree(ctx); } else { - pd->app_ctx[OZ_APPID_SERIAL-1] = ctx; - spin_unlock_bh(&pd->app_lock[OZ_APPID_SERIAL-1]); + pd->app_ctx[OZ_APPID_SERIAL] = ctx; + spin_unlock_bh(&pd->app_lock[OZ_APPID_SERIAL]); } spin_lock(&g_cdev.lock); if ((g_cdev.active_pd == NULL) && @@ -468,10 +468,10 @@ void oz_cdev_stop(struct oz_pd *pd, int pause) oz_dbg(ON, "Serial service paused\n"); return; } - spin_lock_bh(&pd->app_lock[OZ_APPID_SERIAL-1]); - ctx = (struct oz_serial_ctx *)pd->app_ctx[OZ_APPID_SERIAL-1]; - pd->app_ctx[OZ_APPID_SERIAL-1] = NULL; - spin_unlock_bh(&pd->app_lock[OZ_APPID_SERIAL-1]); + spin_lock_bh(&pd->app_lock[OZ_APPID_SERIAL]); + ctx = (struct oz_serial_ctx *) pd->app_ctx[OZ_APPID_SERIAL]; + pd->app_ctx[OZ_APPID_SERIAL] = NULL; + spin_unlock_bh(&pd->app_lock[OZ_APPID_SERIAL]); if (ctx) oz_cdev_release_ctx(ctx); spin_lock(&g_cdev.lock); diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index a27c603..6c4b13f 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -32,11 +32,6 @@ static void oz_retire_frame(struct oz_pd *pd, struct oz_tx_frame *f); static void oz_isoc_stream_free(struct oz_isoc_stream *st); static int oz_send_next_queued_frame(struct oz_pd *pd, int more_data); static void oz_isoc_destructor(struct sk_buff *skb); -static int oz_def_app_init(void); -static void oz_def_app_term(void); -static int oz_def_app_start(struct oz_pd *pd, int resume); -static void oz_def_app_stop(struct oz_pd *pd, int pause); -static void oz_def_app_rx(struct oz_pd *pd, struct oz_elt *elt); /* * Counts the uncompleted isoc frames submitted to netcard. @@ -45,80 +40,25 @@ static atomic_t g_submitted_isoc = ATOMIC_INIT(0); /* Application handler functions. */ -static const struct oz_app_if g_app_if[OZ_APPID_MAX] = { - {oz_usb_init, - oz_usb_term, - oz_usb_start, - oz_usb_stop, - oz_usb_rx, - oz_usb_heartbeat, - oz_usb_farewell, - OZ_APPID_USB}, - - {oz_def_app_init, - oz_def_app_term, - oz_def_app_start, - oz_def_app_stop, - oz_def_app_rx, - NULL, - NULL, - OZ_APPID_UNUSED1}, - - {oz_def_app_init, - oz_def_app_term, - oz_def_app_start, - oz_def_app_stop, - oz_def_app_rx, - NULL, - NULL, - OZ_APPID_UNUSED2}, - - {oz_cdev_init, - oz_cdev_term, - oz_cdev_start, - oz_cdev_stop, - oz_cdev_rx, - NULL, - NULL, - OZ_APPID_SERIAL}, +static const struct oz_app_if g_app_if[OZ_NB_APPS] = { + [OZ_APPID_USB] = { + .init = oz_usb_init, + .term = oz_usb_term, + .start = oz_usb_start, + .stop = oz_usb_stop, + .rx = oz_usb_rx, + .heartbeat = oz_usb_heartbeat, + .farewell = oz_usb_farewell, + }, + [OZ_APPID_SERIAL] = { + .init = oz_cdev_init, + .term = oz_cdev_term, + .start = oz_cdev_start, + .stop = oz_cdev_stop, + .rx = oz_cdev_rx, + }, }; -/* - * Context: process - */ -static int oz_def_app_init(void) -{ - return 0; -} - -/* - * Context: process - */ -static void oz_def_app_term(void) -{ -} - -/* - * Context: softirq - */ -static int oz_def_app_start(struct oz_pd *pd, int resume) -{ - return 0; -} - -/* - * Context: softirq - */ -static void oz_def_app_stop(struct oz_pd *pd, int pause) -{ -} - -/* - * Context: softirq - */ -static void oz_def_app_rx(struct oz_pd *pd, struct oz_elt *elt) -{ -} /* * Context: softirq or process @@ -169,7 +109,7 @@ struct oz_pd *oz_pd_alloc(const u8 *mac_addr) if (pd) { int i; atomic_set(&pd->ref_count, 2); - for (i = 0; i < OZ_APPID_MAX; i++) + for (i = 0; i < OZ_NB_APPS; i++) spin_lock_init(&pd->app_lock[i]); pd->last_rx_pkt_num = 0xffffffff; oz_pd_set_state(pd, OZ_PD_S_IDLE); @@ -269,23 +209,21 @@ void oz_pd_destroy(struct oz_pd *pd) */ int oz_services_start(struct oz_pd *pd, u16 apps, int resume) { - const struct oz_app_if *ai; - int rc = 0; + int i, rc = 0; oz_pd_dbg(pd, ON, "%s: (0x%x) resume(%d)\n", __func__, apps, resume); - for (ai = g_app_if; ai < &g_app_if[OZ_APPID_MAX]; ai++) { - if (apps & (1<<ai->app_id)) { - if (ai->start(pd, resume)) { + for (i = 0; i < OZ_NB_APPS; i++) { + if (g_app_if[i].start && (apps & (1 << i))) { + if (g_app_if[i].start(pd, resume)) { rc = -1; oz_pd_dbg(pd, ON, - "Unable to start service %d\n", - ai->app_id); + "Unable to start service %d\n", i); break; } spin_lock_bh(&g_polling_lock); - pd->total_apps |= (1<<ai->app_id); + pd->total_apps |= (1 << i); if (resume) - pd->paused_apps &= ~(1<<ai->app_id); + pd->paused_apps &= ~(1 << i); spin_unlock_bh(&g_polling_lock); } } @@ -297,20 +235,20 @@ int oz_services_start(struct oz_pd *pd, u16 apps, int resume) */ void oz_services_stop(struct oz_pd *pd, u16 apps, int pause) { - const struct oz_app_if *ai; + int i; oz_pd_dbg(pd, ON, "%s: (0x%x) pause(%d)\n", __func__, apps, pause); - for (ai = g_app_if; ai < &g_app_if[OZ_APPID_MAX]; ai++) { - if (apps & (1<<ai->app_id)) { + for (i = 0; i < OZ_NB_APPS; i++) { + if (g_app_if[i].stop && (apps & (1 << i))) { spin_lock_bh(&g_polling_lock); if (pause) { - pd->paused_apps |= (1<<ai->app_id); + pd->paused_apps |= (1 << i); } else { - pd->total_apps &= ~(1<<ai->app_id); - pd->paused_apps &= ~(1<<ai->app_id); + pd->total_apps &= ~(1 << i); + pd->paused_apps &= ~(1 << i); } spin_unlock_bh(&g_polling_lock); - ai->stop(pd, pause); + g_app_if[i].stop(pd, pause); } } } @@ -320,12 +258,11 @@ void oz_services_stop(struct oz_pd *pd, u16 apps, int pause) */ void oz_pd_heartbeat(struct oz_pd *pd, u16 apps) { - const struct oz_app_if *ai; - int more = 0; + int i, more = 0; - for (ai = g_app_if; ai < &g_app_if[OZ_APPID_MAX]; ai++) { - if (ai->heartbeat && (apps & (1<<ai->app_id))) { - if (ai->heartbeat(pd)) + for (i = 0; i < OZ_NB_APPS; i++) { + if (g_app_if[i].heartbeat && (apps & (1 << i))) { + if (g_app_if[i].heartbeat(pd)) more = 1; } } @@ -957,9 +894,10 @@ void oz_apps_init(void) { int i; - for (i = 0; i < OZ_APPID_MAX; i++) + for (i = 0; i < OZ_NB_APPS; i++) { if (g_app_if[i].init) g_app_if[i].init(); + } } /* @@ -970,9 +908,10 @@ void oz_apps_term(void) int i; /* Terminate all the apps. */ - for (i = 0; i < OZ_APPID_MAX; i++) + for (i = 0; i < OZ_NB_APPS; i++) { if (g_app_if[i].term) g_app_if[i].term(); + } } /* @@ -980,12 +919,8 @@ void oz_apps_term(void) */ void oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt) { - const struct oz_app_if *ai; - - if (app_id == 0 || app_id > OZ_APPID_MAX) - return; - ai = &g_app_if[app_id-1]; - ai->rx(pd, elt); + if (app_id < OZ_NB_APPS && g_app_if[app_id].rx) + g_app_if[app_id].rx(pd, elt); } /* @@ -994,7 +929,7 @@ void oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt) void oz_pd_indicate_farewells(struct oz_pd *pd) { struct oz_farewell *f; - const struct oz_app_if *ai = &g_app_if[OZ_APPID_USB-1]; + const struct oz_app_if *ai = &g_app_if[OZ_APPID_USB]; while (1) { spin_lock_bh(&g_polling_lock); diff --git a/drivers/staging/ozwpan/ozpd.h b/drivers/staging/ozwpan/ozpd.h index ad5fe7a..3b3b3ce 100644 --- a/drivers/staging/ozwpan/ozpd.h +++ b/drivers/staging/ozwpan/ozpd.h @@ -81,8 +81,8 @@ struct oz_pd { unsigned long presleep; unsigned long keep_alive; struct oz_elt_buf elt_buff; - void *app_ctx[OZ_APPID_MAX]; - spinlock_t app_lock[OZ_APPID_MAX]; + void *app_ctx[OZ_NB_APPS]; + spinlock_t app_lock[OZ_NB_APPS]; int max_tx_size; u8 mode; u8 ms_per_isoc; diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c index 4aebe16..549fe7f 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -614,7 +614,7 @@ struct oz_pd *oz_pd_find(const u8 *mac_addr) */ void oz_app_enable(int app_id, int enable) { - if (app_id <= OZ_APPID_MAX) { + if (app_id < OZ_NB_APPS) { spin_lock_bh(&g_polling_lock); if (enable) g_apps |= (1<<app_id); diff --git a/drivers/staging/ozwpan/ozproto.h b/drivers/staging/ozwpan/ozproto.h index 378b737..f1d30c4 100644 --- a/drivers/staging/ozwpan/ozproto.h +++ b/drivers/staging/ozwpan/ozproto.h @@ -46,7 +46,6 @@ struct oz_app_if { oz_app_rx_fn_t rx; oz_app_heartbeat_fn_t heartbeat; oz_app_farewell_fn_t farewell; - int app_id; }; int oz_protocol_init(char *devs); diff --git a/drivers/staging/ozwpan/ozprotocol.h b/drivers/staging/ozwpan/ozprotocol.h index 9bbb182..4642072 100644 --- a/drivers/staging/ozwpan/ozprotocol.h +++ b/drivers/staging/ozwpan/ozprotocol.h @@ -139,8 +139,6 @@ struct oz_app_hdr { /* Values for app_id. */ #define OZ_APPID_USB 0x1 -#define OZ_APPID_UNUSED1 0x2 -#define OZ_APPID_UNUSED2 0x3 #define OZ_APPID_SERIAL 0x4 #define OZ_APPID_MAX OZ_APPID_SERIAL #define OZ_NB_APPS (OZ_APPID_MAX+1) diff --git a/drivers/staging/ozwpan/ozusbsvc.c b/drivers/staging/ozwpan/ozusbsvc.c index edd44c4..db4a387 100644 --- a/drivers/staging/ozwpan/ozusbsvc.c +++ b/drivers/staging/ozwpan/ozusbsvc.c @@ -73,12 +73,12 @@ int oz_usb_start(struct oz_pd *pd, int resume) * If it does already have one then destroy the one we have just * created. */ - spin_lock_bh(&pd->app_lock[OZ_APPID_USB-1]); - old_ctx = pd->app_ctx[OZ_APPID_USB-1]; + spin_lock_bh(&pd->app_lock[OZ_APPID_USB]); + old_ctx = pd->app_ctx[OZ_APPID_USB]; if (old_ctx == NULL) - pd->app_ctx[OZ_APPID_USB-1] = usb_ctx; - oz_usb_get(pd->app_ctx[OZ_APPID_USB-1]); - spin_unlock_bh(&pd->app_lock[OZ_APPID_USB-1]); + pd->app_ctx[OZ_APPID_USB] = usb_ctx; + oz_usb_get(pd->app_ctx[OZ_APPID_USB]); + spin_unlock_bh(&pd->app_lock[OZ_APPID_USB]); if (old_ctx) { oz_dbg(ON, "Already have USB context\n"); kfree(usb_ctx); @@ -99,9 +99,9 @@ int oz_usb_start(struct oz_pd *pd, int resume) usb_ctx->hport = oz_hcd_pd_arrived(usb_ctx); if (usb_ctx->hport == NULL) { oz_dbg(ON, "USB hub returned null port\n"); - spin_lock_bh(&pd->app_lock[OZ_APPID_USB-1]); - pd->app_ctx[OZ_APPID_USB-1] = NULL; - spin_unlock_bh(&pd->app_lock[OZ_APPID_USB-1]); + spin_lock_bh(&pd->app_lock[OZ_APPID_USB]); + pd->app_ctx[OZ_APPID_USB] = NULL; + spin_unlock_bh(&pd->app_lock[OZ_APPID_USB]); oz_usb_put(usb_ctx); rc = -1; } @@ -122,10 +122,10 @@ void oz_usb_stop(struct oz_pd *pd, int pause) oz_dbg(ON, "USB service paused\n"); return; } - spin_lock_bh(&pd->app_lock[OZ_APPID_USB-1]); - usb_ctx = (struct oz_usb_ctx *)pd->app_ctx[OZ_APPID_USB-1]; - pd->app_ctx[OZ_APPID_USB-1] = NULL; - spin_unlock_bh(&pd->app_lock[OZ_APPID_USB-1]); + spin_lock_bh(&pd->app_lock[OZ_APPID_USB]); + usb_ctx = (struct oz_usb_ctx *) pd->app_ctx[OZ_APPID_USB]; + pd->app_ctx[OZ_APPID_USB] = NULL; + spin_unlock_bh(&pd->app_lock[OZ_APPID_USB]); if (usb_ctx) { struct timespec ts, now; getnstimeofday(&ts); @@ -187,11 +187,11 @@ int oz_usb_heartbeat(struct oz_pd *pd) struct oz_usb_ctx *usb_ctx; int rc = 0; - spin_lock_bh(&pd->app_lock[OZ_APPID_USB-1]); - usb_ctx = (struct oz_usb_ctx *)pd->app_ctx[OZ_APPID_USB-1]; + spin_lock_bh(&pd->app_lock[OZ_APPID_USB]); + usb_ctx = (struct oz_usb_ctx *) pd->app_ctx[OZ_APPID_USB]; if (usb_ctx) oz_usb_get(usb_ctx); - spin_unlock_bh(&pd->app_lock[OZ_APPID_USB-1]); + spin_unlock_bh(&pd->app_lock[OZ_APPID_USB]); if (usb_ctx == NULL) return rc; if (usb_ctx->stopped) diff --git a/drivers/staging/ozwpan/ozusbsvc1.c b/drivers/staging/ozwpan/ozusbsvc1.c index f32d014..12bb236 100644 --- a/drivers/staging/ozwpan/ozusbsvc1.c +++ b/drivers/staging/ozwpan/ozusbsvc1.c @@ -364,11 +364,11 @@ void oz_usb_rx(struct oz_pd *pd, struct oz_elt *elt) struct oz_usb_hdr *usb_hdr = (struct oz_usb_hdr *)(elt + 1); struct oz_usb_ctx *usb_ctx; - spin_lock_bh(&pd->app_lock[OZ_APPID_USB-1]); - usb_ctx = (struct oz_usb_ctx *)pd->app_ctx[OZ_APPID_USB-1]; + spin_lock_bh(&pd->app_lock[OZ_APPID_USB]); + usb_ctx = (struct oz_usb_ctx *)pd->app_ctx[OZ_APPID_USB]; if (usb_ctx) oz_usb_get(usb_ctx); - spin_unlock_bh(&pd->app_lock[OZ_APPID_USB-1]); + spin_unlock_bh(&pd->app_lock[OZ_APPID_USB]); if (usb_ctx == NULL) return; /* Context has gone so nothing to do. */ if (usb_ctx->stopped) @@ -434,11 +434,11 @@ void oz_usb_farewell(struct oz_pd *pd, u8 ep_num, u8 *data, u8 len) { struct oz_usb_ctx *usb_ctx; - spin_lock_bh(&pd->app_lock[OZ_APPID_USB-1]); - usb_ctx = (struct oz_usb_ctx *)pd->app_ctx[OZ_APPID_USB-1]; + spin_lock_bh(&pd->app_lock[OZ_APPID_USB]); + usb_ctx = (struct oz_usb_ctx *)pd->app_ctx[OZ_APPID_USB]; if (usb_ctx) oz_usb_get(usb_ctx); - spin_unlock_bh(&pd->app_lock[OZ_APPID_USB-1]); + spin_unlock_bh(&pd->app_lock[OZ_APPID_USB]); if (usb_ctx == NULL) return; /* Context has gone so nothing to do. */ if (!usb_ctx->stopped) { -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 06/10] staging: ozwpan: Simplify app interface 2014-08-04 12:54 ` [PATCH 06/10] staging: ozwpan: Simplify app interface Christoph Jaeger @ 2014-08-05 11:13 ` Dan Carpenter 0 siblings, 0 replies; 17+ messages in thread From: Dan Carpenter @ 2014-08-05 11:13 UTC (permalink / raw) To: Christoph Jaeger; +Cc: shigekatsu.tateno, gregkh, devel, linux-kernel On Mon, Aug 04, 2014 at 02:54:52PM +0200, Christoph Jaeger wrote: > Simplify the somewhat overcomplicated application interface; improves > readability and saves a bunch of lines. > > Use designated struct initializers for clarity. I was worried this would change the API but it doesn't. The patch looks ok. Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com> regards, dan carpenter ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 07/10] staging: ozwpan: Use slab cache for oz_urb_link allocation 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger ` (5 preceding siblings ...) 2014-08-04 12:54 ` [PATCH 06/10] staging: ozwpan: Simplify app interface Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-05 11:18 ` Dan Carpenter 2014-08-08 5:59 ` [PATCH 07/10 v2] " Christoph Jaeger 2014-08-04 12:54 ` [PATCH 08/10] staging: ozwpan: Use slab cache for oz_elt_info allocation Christoph Jaeger ` (2 subsequent siblings) 9 siblings, 2 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Use a slab cache rather than rolling our own free list. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozhcd.c | 70 ++++++++---------------------------------- 1 file changed, 12 insertions(+), 58 deletions(-) diff --git a/drivers/staging/ozwpan/ozhcd.c b/drivers/staging/ozwpan/ozhcd.c index 30bd928..3b603c5 100644 --- a/drivers/staging/ozwpan/ozhcd.c +++ b/drivers/staging/ozwpan/ozhcd.c @@ -45,10 +45,6 @@ */ #define OZ_PLAT_DEV_NAME "ozwpan" -/* Maximum number of free urb links that can be kept in the pool. - */ -#define OZ_MAX_LINK_POOL_SIZE 16 - /* Get endpoint object from the containing link. */ #define ep_from_link(__e) container_of((__e), struct oz_endpoint, link) @@ -75,6 +71,8 @@ struct oz_urb_link { unsigned submit_counter; }; +static struct kmem_cache *oz_urb_link_cache; + /* Holds state information about a USB endpoint. */ #define OZ_EP_BUFFER_SIZE_ISOC (1024 * 24) @@ -198,9 +196,6 @@ static struct platform_device *g_plat_dev; static struct oz_hcd *g_ozhcd; static DEFINE_SPINLOCK(g_hcdlock); /* Guards g_ozhcd. */ static const char g_hcd_name[] = "Ozmo WPAN"; -static struct list_head *g_link_pool; -static int g_link_pool_size; -static DEFINE_SPINLOCK(g_link_lock); static DEFINE_SPINLOCK(g_tasklet_lock); static struct tasklet_struct g_urb_process_tasklet; static struct tasklet_struct g_urb_cancel_tasklet; @@ -265,68 +260,22 @@ static int oz_get_port_from_addr(struct oz_hcd *ozhcd, u8 bus_addr) } /* - * Allocates an urb link, first trying the pool but going to heap if empty. * Context: any */ static struct oz_urb_link *oz_alloc_urb_link(void) { - struct oz_urb_link *urbl = NULL; - unsigned long irq_state; - - spin_lock_irqsave(&g_link_lock, irq_state); - if (g_link_pool) { - urbl = container_of(g_link_pool, struct oz_urb_link, link); - g_link_pool = urbl->link.next; - --g_link_pool_size; - } - spin_unlock_irqrestore(&g_link_lock, irq_state); - if (urbl == NULL) - urbl = kmalloc(sizeof(struct oz_urb_link), GFP_ATOMIC); - return urbl; + return kmem_cache_alloc(oz_urb_link_cache, GFP_ATOMIC); } /* - * Frees an urb link by putting it in the pool if there is enough space or - * deallocating it to heap otherwise. * Context: any */ static void oz_free_urb_link(struct oz_urb_link *urbl) { - if (urbl) { - unsigned long irq_state; - - spin_lock_irqsave(&g_link_lock, irq_state); - if (g_link_pool_size < OZ_MAX_LINK_POOL_SIZE) { - urbl->link.next = g_link_pool; - g_link_pool = &urbl->link; - urbl = NULL; - g_link_pool_size++; - } - spin_unlock_irqrestore(&g_link_lock, irq_state); - kfree(urbl); - } -} - -/* - * Deallocates all the urb links in the pool. - * Context: unknown - */ -static void oz_empty_link_pool(void) -{ - struct list_head *e; - unsigned long irq_state; + if (unlikely(!urbl)) + return; - spin_lock_irqsave(&g_link_lock, irq_state); - e = g_link_pool; - g_link_pool = NULL; - g_link_pool_size = 0; - spin_unlock_irqrestore(&g_link_lock, irq_state); - while (e) { - struct oz_urb_link *urbl = - container_of(e, struct oz_urb_link, link); - e = e->next; - kfree(urbl); - } + kmem_cache_free(oz_urb_link_cache, urbl); } /* @@ -2311,7 +2260,6 @@ static int oz_plat_remove(struct platform_device *dev) oz_dbg(ON, "Removing hcd\n"); usb_remove_hcd(hcd); usb_put_hcd(hcd); - oz_empty_link_pool(); return 0; } @@ -2341,6 +2289,11 @@ int oz_hcd_init(void) if (usb_disabled()) return -ENODEV; + + oz_urb_link_cache = KMEM_CACHE(oz_urb_link, 0); + if (unlikely(!oz_urb_link_cache)) + return -ENOMEM; + tasklet_init(&g_urb_process_tasklet, oz_urb_process_tasklet, 0); tasklet_init(&g_urb_cancel_tasklet, oz_urb_cancel_tasklet, 0); err = platform_driver_register(&g_oz_plat_drv); @@ -2380,4 +2333,5 @@ void oz_hcd_term(void) platform_device_unregister(g_plat_dev); platform_driver_unregister(&g_oz_plat_drv); oz_dbg(ON, "Pending urbs:%d\n", atomic_read(&g_pending_urbs)); + kmem_cache_destroy(oz_urb_link_cache); } -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 07/10] staging: ozwpan: Use slab cache for oz_urb_link allocation 2014-08-04 12:54 ` [PATCH 07/10] staging: ozwpan: Use slab cache for oz_urb_link allocation Christoph Jaeger @ 2014-08-05 11:18 ` Dan Carpenter 2014-08-08 5:59 ` [PATCH 07/10 v2] " Christoph Jaeger 1 sibling, 0 replies; 17+ messages in thread From: Dan Carpenter @ 2014-08-05 11:18 UTC (permalink / raw) To: Christoph Jaeger; +Cc: shigekatsu.tateno, gregkh, devel, linux-kernel On Mon, Aug 04, 2014 at 02:54:53PM +0200, Christoph Jaeger wrote: > @@ -2341,6 +2289,11 @@ int oz_hcd_init(void) > > if (usb_disabled()) > return -ENODEV; > + > + oz_urb_link_cache = KMEM_CACHE(oz_urb_link, 0); > + if (unlikely(!oz_urb_link_cache)) > + return -ENOMEM; Don't put unlikely() calls in driver code. It just makes it messy for no reason. "Oooo! I can modprobe/rmmod this driver 1000000 times in a row and it speeds it up .0003 seconds because I added an unlikely tag!" regards, dan carpenter ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 07/10 v2] staging: ozwpan: Use slab cache for oz_urb_link allocation 2014-08-04 12:54 ` [PATCH 07/10] staging: ozwpan: Use slab cache for oz_urb_link allocation Christoph Jaeger 2014-08-05 11:18 ` Dan Carpenter @ 2014-08-08 5:59 ` Christoph Jaeger 1 sibling, 0 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-08 5:59 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Use a slab cache rather than rolling our own free list. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- v2: Don't use likely()/unlikely(). drivers/staging/ozwpan/ozhcd.c | 70 ++++++++---------------------------------- 1 file changed, 12 insertions(+), 58 deletions(-) diff --git a/drivers/staging/ozwpan/ozhcd.c b/drivers/staging/ozwpan/ozhcd.c index 30bd928..1142f57 100644 --- a/drivers/staging/ozwpan/ozhcd.c +++ b/drivers/staging/ozwpan/ozhcd.c @@ -45,10 +45,6 @@ */ #define OZ_PLAT_DEV_NAME "ozwpan" -/* Maximum number of free urb links that can be kept in the pool. - */ -#define OZ_MAX_LINK_POOL_SIZE 16 - /* Get endpoint object from the containing link. */ #define ep_from_link(__e) container_of((__e), struct oz_endpoint, link) @@ -75,6 +71,8 @@ struct oz_urb_link { unsigned submit_counter; }; +static struct kmem_cache *oz_urb_link_cache; + /* Holds state information about a USB endpoint. */ #define OZ_EP_BUFFER_SIZE_ISOC (1024 * 24) @@ -198,9 +196,6 @@ static struct platform_device *g_plat_dev; static struct oz_hcd *g_ozhcd; static DEFINE_SPINLOCK(g_hcdlock); /* Guards g_ozhcd. */ static const char g_hcd_name[] = "Ozmo WPAN"; -static struct list_head *g_link_pool; -static int g_link_pool_size; -static DEFINE_SPINLOCK(g_link_lock); static DEFINE_SPINLOCK(g_tasklet_lock); static struct tasklet_struct g_urb_process_tasklet; static struct tasklet_struct g_urb_cancel_tasklet; @@ -265,68 +260,22 @@ static int oz_get_port_from_addr(struct oz_hcd *ozhcd, u8 bus_addr) } /* - * Allocates an urb link, first trying the pool but going to heap if empty. * Context: any */ static struct oz_urb_link *oz_alloc_urb_link(void) { - struct oz_urb_link *urbl = NULL; - unsigned long irq_state; - - spin_lock_irqsave(&g_link_lock, irq_state); - if (g_link_pool) { - urbl = container_of(g_link_pool, struct oz_urb_link, link); - g_link_pool = urbl->link.next; - --g_link_pool_size; - } - spin_unlock_irqrestore(&g_link_lock, irq_state); - if (urbl == NULL) - urbl = kmalloc(sizeof(struct oz_urb_link), GFP_ATOMIC); - return urbl; + return kmem_cache_alloc(oz_urb_link_cache, GFP_ATOMIC); } /* - * Frees an urb link by putting it in the pool if there is enough space or - * deallocating it to heap otherwise. * Context: any */ static void oz_free_urb_link(struct oz_urb_link *urbl) { - if (urbl) { - unsigned long irq_state; - - spin_lock_irqsave(&g_link_lock, irq_state); - if (g_link_pool_size < OZ_MAX_LINK_POOL_SIZE) { - urbl->link.next = g_link_pool; - g_link_pool = &urbl->link; - urbl = NULL; - g_link_pool_size++; - } - spin_unlock_irqrestore(&g_link_lock, irq_state); - kfree(urbl); - } -} - -/* - * Deallocates all the urb links in the pool. - * Context: unknown - */ -static void oz_empty_link_pool(void) -{ - struct list_head *e; - unsigned long irq_state; + if (!urbl) + return; - spin_lock_irqsave(&g_link_lock, irq_state); - e = g_link_pool; - g_link_pool = NULL; - g_link_pool_size = 0; - spin_unlock_irqrestore(&g_link_lock, irq_state); - while (e) { - struct oz_urb_link *urbl = - container_of(e, struct oz_urb_link, link); - e = e->next; - kfree(urbl); - } + kmem_cache_free(oz_urb_link_cache, urbl); } /* @@ -2311,7 +2260,6 @@ static int oz_plat_remove(struct platform_device *dev) oz_dbg(ON, "Removing hcd\n"); usb_remove_hcd(hcd); usb_put_hcd(hcd); - oz_empty_link_pool(); return 0; } @@ -2341,6 +2289,11 @@ int oz_hcd_init(void) if (usb_disabled()) return -ENODEV; + + oz_urb_link_cache = KMEM_CACHE(oz_urb_link, 0); + if (!oz_urb_link_cache) + return -ENOMEM; + tasklet_init(&g_urb_process_tasklet, oz_urb_process_tasklet, 0); tasklet_init(&g_urb_cancel_tasklet, oz_urb_cancel_tasklet, 0); err = platform_driver_register(&g_oz_plat_drv); @@ -2380,4 +2333,5 @@ void oz_hcd_term(void) platform_device_unregister(g_plat_dev); platform_driver_unregister(&g_oz_plat_drv); oz_dbg(ON, "Pending urbs:%d\n", atomic_read(&g_pending_urbs)); + kmem_cache_destroy(oz_urb_link_cache); } -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 08/10] staging: ozwpan: Use slab cache for oz_elt_info allocation 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger ` (6 preceding siblings ...) 2014-08-04 12:54 ` [PATCH 07/10] staging: ozwpan: Use slab cache for oz_urb_link allocation Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-08 6:00 ` [PATCH 08/10 v2] " Christoph Jaeger 2014-08-04 12:54 ` [PATCH 09/10] staging: ozwpan: Use slab cache for oz_tx_frame allocation Christoph Jaeger 2014-08-04 12:54 ` [PATCH 10/10] staging: ozwpan: Use list helpers Christoph Jaeger 9 siblings, 1 reply; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Use a slab cache rather than rolling our own free list. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozeltbuf.c | 70 +++------------------------------------ drivers/staging/ozwpan/ozeltbuf.h | 5 --- drivers/staging/ozwpan/ozpd.c | 2 -- drivers/staging/ozwpan/ozpd.h | 2 ++ drivers/staging/ozwpan/ozproto.c | 9 +++++ drivers/staging/ozwpan/ozproto.h | 2 ++ 6 files changed, 17 insertions(+), 73 deletions(-) diff --git a/drivers/staging/ozwpan/ozeltbuf.c b/drivers/staging/ozwpan/ozeltbuf.c index f6e6481..81580cb 100644 --- a/drivers/staging/ozwpan/ozeltbuf.c +++ b/drivers/staging/ozwpan/ozeltbuf.c @@ -10,9 +10,6 @@ #include "ozeltbuf.h" #include "ozpd.h" -#define OZ_ELT_INFO_MAGIC_USED 0x35791057 -#define OZ_ELT_INFO_MAGIC_FREE 0x78940102 - /* * Context: softirq-serialized */ @@ -22,7 +19,6 @@ void oz_elt_buf_init(struct oz_elt_buf *buf) INIT_LIST_HEAD(&buf->stream_list); INIT_LIST_HEAD(&buf->order_list); INIT_LIST_HEAD(&buf->isoc_list); - buf->max_free_elts = 32; spin_lock_init(&buf->lock); } @@ -49,14 +45,6 @@ void oz_elt_buf_term(struct oz_elt_buf *buf) kfree(ei); } } - /* Free any elelment in the pool. */ - while (buf->elt_pool) { - struct oz_elt_info *ei = - container_of(buf->elt_pool, struct oz_elt_info, link); - buf->elt_pool = buf->elt_pool->next; - kfree(ei); - } - buf->free_elts = 0; } /* @@ -66,27 +54,8 @@ struct oz_elt_info *oz_elt_info_alloc(struct oz_elt_buf *buf) { struct oz_elt_info *ei; - spin_lock_bh(&buf->lock); - if (buf->free_elts && buf->elt_pool) { - ei = container_of(buf->elt_pool, struct oz_elt_info, link); - buf->elt_pool = ei->link.next; - buf->free_elts--; - spin_unlock_bh(&buf->lock); - if (ei->magic != OZ_ELT_INFO_MAGIC_FREE) { - oz_dbg(ON, "%s: ei with bad magic: 0x%x\n", - __func__, ei->magic); - } - } else { - spin_unlock_bh(&buf->lock); - ei = kmalloc(sizeof(struct oz_elt_info), GFP_ATOMIC); - } - if (ei) { - ei->flags = 0; - ei->app_id = 0; - ei->callback = NULL; - ei->context = 0; - ei->stream = NULL; - ei->magic = OZ_ELT_INFO_MAGIC_USED; + ei = kmem_cache_zalloc(oz_elt_info_cache, GFP_ATOMIC); + if (likely(ei)) { INIT_LIST_HEAD(&ei->link); INIT_LIST_HEAD(&ei->link_order); } @@ -99,17 +68,8 @@ struct oz_elt_info *oz_elt_info_alloc(struct oz_elt_buf *buf) */ void oz_elt_info_free(struct oz_elt_buf *buf, struct oz_elt_info *ei) { - if (ei) { - if (ei->magic == OZ_ELT_INFO_MAGIC_USED) { - buf->free_elts++; - ei->link.next = buf->elt_pool; - buf->elt_pool = &ei->link; - ei->magic = OZ_ELT_INFO_MAGIC_FREE; - } else { - oz_dbg(ON, "%s: bad magic ei: %p magic: 0x%x\n", - __func__, ei, ei->magic); - } - } + if (likely(ei)) + kmem_cache_free(oz_elt_info_cache, ei); } /*------------------------------------------------------------------------------ @@ -313,25 +273,3 @@ int oz_are_elts_available(struct oz_elt_buf *buf) { return buf->order_list.next != &buf->order_list; } - -void oz_trim_elt_pool(struct oz_elt_buf *buf) -{ - struct list_head *free = NULL; - struct list_head *e; - - spin_lock_bh(&buf->lock); - while (buf->free_elts > buf->max_free_elts) { - e = buf->elt_pool; - buf->elt_pool = e->next; - e->next = free; - free = e; - buf->free_elts--; - } - spin_unlock_bh(&buf->lock); - while (free) { - struct oz_elt_info *ei = - container_of(free, struct oz_elt_info, link); - free = free->next; - kfree(ei); - } -} diff --git a/drivers/staging/ozwpan/ozeltbuf.h b/drivers/staging/ozwpan/ozeltbuf.h index 3846432..f09f5fe 100644 --- a/drivers/staging/ozwpan/ozeltbuf.h +++ b/drivers/staging/ozwpan/ozeltbuf.h @@ -34,7 +34,6 @@ struct oz_elt_info { struct oz_elt_stream *stream; u8 data[sizeof(struct oz_elt) + OZ_MAX_ELT_PAYLOAD]; int length; - unsigned magic; }; /* Flags values */ #define OZ_EI_F_MARKED 0x1 @@ -44,9 +43,6 @@ struct oz_elt_buf { struct list_head stream_list; struct list_head order_list; struct list_head isoc_list; - struct list_head *elt_pool; - int free_elts; - int max_free_elts; u8 tx_seq_num[OZ_NB_APPS]; }; @@ -64,7 +60,6 @@ int oz_queue_elt_info(struct oz_elt_buf *buf, u8 isoc, u8 id, int oz_select_elts_for_tx(struct oz_elt_buf *buf, u8 isoc, unsigned *len, unsigned max_len, struct list_head *list); int oz_are_elts_available(struct oz_elt_buf *buf); -void oz_trim_elt_pool(struct oz_elt_buf *buf); #endif /* _OZELTBUF_H */ diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index 6c4b13f..c6fddb8 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -504,8 +504,6 @@ static void oz_retire_frame(struct oz_pd *pd, struct oz_tx_frame *f) spin_unlock_bh(&pd->elt_buff.lock); } oz_tx_frame_free(pd, f); - if (pd->elt_buff.free_elts > pd->elt_buff.max_free_elts) - oz_trim_elt_pool(&pd->elt_buff); } /* diff --git a/drivers/staging/ozwpan/ozpd.h b/drivers/staging/ozwpan/ozpd.h index 3b3b3ce..43a26ea 100644 --- a/drivers/staging/ozwpan/ozpd.h +++ b/drivers/staging/ozwpan/ozpd.h @@ -130,4 +130,6 @@ void oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt); void oz_apps_init(void); void oz_apps_term(void); +extern struct kmem_cache *oz_elt_info_cache; + #endif /* Sentry */ diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c index 549fe7f..00d245b 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -11,6 +11,7 @@ #include <linux/etherdevice.h> #include <linux/errno.h> #include <linux/ieee80211.h> +#include <linux/slab.h> #include "ozdbg.h" #include "ozprotocol.h" #include "ozeltbuf.h" @@ -51,6 +52,8 @@ static u8 g_session_id; static u16 g_apps = 0x1; static int g_processing_rx; +struct kmem_cache *oz_elt_info_cache; + /* * Context: softirq-serialized */ @@ -479,6 +482,8 @@ void oz_protocol_term(void) } spin_unlock_bh(&g_polling_lock); oz_dbg(ON, "Protocol stopped\n"); + + kmem_cache_destroy(oz_elt_info_cache); } /* @@ -762,6 +767,10 @@ static char *oz_get_next_device_name(char *s, char *dname, int max_size) */ int oz_protocol_init(char *devs) { + oz_elt_info_cache = KMEM_CACHE(oz_elt_info, 0); + if (unlikely(!oz_elt_info_cache)) + return -ENOMEM; + skb_queue_head_init(&g_rx_queue); if (devs[0] == '*') { oz_binding_add(NULL); diff --git a/drivers/staging/ozwpan/ozproto.h b/drivers/staging/ozwpan/ozproto.h index f1d30c4..b0f7459 100644 --- a/drivers/staging/ozwpan/ozproto.h +++ b/drivers/staging/ozwpan/ozproto.h @@ -65,4 +65,6 @@ enum hrtimer_restart oz_pd_timeout_event(struct hrtimer *timer); int oz_get_pd_status_list(char *pd_list, int max_count); int oz_get_binding_list(char *buf, int max_if); +extern struct kmem_cache *oz_elt_info_cache; + #endif /* _OZPROTO_H */ -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 08/10 v2] staging: ozwpan: Use slab cache for oz_elt_info allocation 2014-08-04 12:54 ` [PATCH 08/10] staging: ozwpan: Use slab cache for oz_elt_info allocation Christoph Jaeger @ 2014-08-08 6:00 ` Christoph Jaeger 0 siblings, 0 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-08 6:00 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Use a slab cache rather than rolling our own free list. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- v2: Don't use likely()/unlikely(). drivers/staging/ozwpan/ozeltbuf.c | 68 ++------------------------------------- drivers/staging/ozwpan/ozeltbuf.h | 5 --- drivers/staging/ozwpan/ozpd.c | 2 -- drivers/staging/ozwpan/ozpd.h | 2 ++ drivers/staging/ozwpan/ozproto.c | 9 ++++++ drivers/staging/ozwpan/ozproto.h | 2 ++ 6 files changed, 16 insertions(+), 72 deletions(-) diff --git a/drivers/staging/ozwpan/ozeltbuf.c b/drivers/staging/ozwpan/ozeltbuf.c index f6e6481..389ab1a 100644 --- a/drivers/staging/ozwpan/ozeltbuf.c +++ b/drivers/staging/ozwpan/ozeltbuf.c @@ -10,9 +10,6 @@ #include "ozeltbuf.h" #include "ozpd.h" -#define OZ_ELT_INFO_MAGIC_USED 0x35791057 -#define OZ_ELT_INFO_MAGIC_FREE 0x78940102 - /* * Context: softirq-serialized */ @@ -22,7 +19,6 @@ void oz_elt_buf_init(struct oz_elt_buf *buf) INIT_LIST_HEAD(&buf->stream_list); INIT_LIST_HEAD(&buf->order_list); INIT_LIST_HEAD(&buf->isoc_list); - buf->max_free_elts = 32; spin_lock_init(&buf->lock); } @@ -49,14 +45,6 @@ void oz_elt_buf_term(struct oz_elt_buf *buf) kfree(ei); } } - /* Free any elelment in the pool. */ - while (buf->elt_pool) { - struct oz_elt_info *ei = - container_of(buf->elt_pool, struct oz_elt_info, link); - buf->elt_pool = buf->elt_pool->next; - kfree(ei); - } - buf->free_elts = 0; } /* @@ -66,27 +54,8 @@ struct oz_elt_info *oz_elt_info_alloc(struct oz_elt_buf *buf) { struct oz_elt_info *ei; - spin_lock_bh(&buf->lock); - if (buf->free_elts && buf->elt_pool) { - ei = container_of(buf->elt_pool, struct oz_elt_info, link); - buf->elt_pool = ei->link.next; - buf->free_elts--; - spin_unlock_bh(&buf->lock); - if (ei->magic != OZ_ELT_INFO_MAGIC_FREE) { - oz_dbg(ON, "%s: ei with bad magic: 0x%x\n", - __func__, ei->magic); - } - } else { - spin_unlock_bh(&buf->lock); - ei = kmalloc(sizeof(struct oz_elt_info), GFP_ATOMIC); - } + ei = kmem_cache_zalloc(oz_elt_info_cache, GFP_ATOMIC); if (ei) { - ei->flags = 0; - ei->app_id = 0; - ei->callback = NULL; - ei->context = 0; - ei->stream = NULL; - ei->magic = OZ_ELT_INFO_MAGIC_USED; INIT_LIST_HEAD(&ei->link); INIT_LIST_HEAD(&ei->link_order); } @@ -99,17 +68,8 @@ struct oz_elt_info *oz_elt_info_alloc(struct oz_elt_buf *buf) */ void oz_elt_info_free(struct oz_elt_buf *buf, struct oz_elt_info *ei) { - if (ei) { - if (ei->magic == OZ_ELT_INFO_MAGIC_USED) { - buf->free_elts++; - ei->link.next = buf->elt_pool; - buf->elt_pool = &ei->link; - ei->magic = OZ_ELT_INFO_MAGIC_FREE; - } else { - oz_dbg(ON, "%s: bad magic ei: %p magic: 0x%x\n", - __func__, ei, ei->magic); - } - } + if (ei) + kmem_cache_free(oz_elt_info_cache, ei); } /*------------------------------------------------------------------------------ @@ -313,25 +273,3 @@ int oz_are_elts_available(struct oz_elt_buf *buf) { return buf->order_list.next != &buf->order_list; } - -void oz_trim_elt_pool(struct oz_elt_buf *buf) -{ - struct list_head *free = NULL; - struct list_head *e; - - spin_lock_bh(&buf->lock); - while (buf->free_elts > buf->max_free_elts) { - e = buf->elt_pool; - buf->elt_pool = e->next; - e->next = free; - free = e; - buf->free_elts--; - } - spin_unlock_bh(&buf->lock); - while (free) { - struct oz_elt_info *ei = - container_of(free, struct oz_elt_info, link); - free = free->next; - kfree(ei); - } -} diff --git a/drivers/staging/ozwpan/ozeltbuf.h b/drivers/staging/ozwpan/ozeltbuf.h index 3846432..f09f5fe 100644 --- a/drivers/staging/ozwpan/ozeltbuf.h +++ b/drivers/staging/ozwpan/ozeltbuf.h @@ -34,7 +34,6 @@ struct oz_elt_info { struct oz_elt_stream *stream; u8 data[sizeof(struct oz_elt) + OZ_MAX_ELT_PAYLOAD]; int length; - unsigned magic; }; /* Flags values */ #define OZ_EI_F_MARKED 0x1 @@ -44,9 +43,6 @@ struct oz_elt_buf { struct list_head stream_list; struct list_head order_list; struct list_head isoc_list; - struct list_head *elt_pool; - int free_elts; - int max_free_elts; u8 tx_seq_num[OZ_NB_APPS]; }; @@ -64,7 +60,6 @@ int oz_queue_elt_info(struct oz_elt_buf *buf, u8 isoc, u8 id, int oz_select_elts_for_tx(struct oz_elt_buf *buf, u8 isoc, unsigned *len, unsigned max_len, struct list_head *list); int oz_are_elts_available(struct oz_elt_buf *buf); -void oz_trim_elt_pool(struct oz_elt_buf *buf); #endif /* _OZELTBUF_H */ diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index 6c4b13f..c6fddb8 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -504,8 +504,6 @@ static void oz_retire_frame(struct oz_pd *pd, struct oz_tx_frame *f) spin_unlock_bh(&pd->elt_buff.lock); } oz_tx_frame_free(pd, f); - if (pd->elt_buff.free_elts > pd->elt_buff.max_free_elts) - oz_trim_elt_pool(&pd->elt_buff); } /* diff --git a/drivers/staging/ozwpan/ozpd.h b/drivers/staging/ozwpan/ozpd.h index 3b3b3ce..43a26ea 100644 --- a/drivers/staging/ozwpan/ozpd.h +++ b/drivers/staging/ozwpan/ozpd.h @@ -130,4 +130,6 @@ void oz_handle_app_elt(struct oz_pd *pd, u8 app_id, struct oz_elt *elt); void oz_apps_init(void); void oz_apps_term(void); +extern struct kmem_cache *oz_elt_info_cache; + #endif /* Sentry */ diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c index 549fe7f..b592e96 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -11,6 +11,7 @@ #include <linux/etherdevice.h> #include <linux/errno.h> #include <linux/ieee80211.h> +#include <linux/slab.h> #include "ozdbg.h" #include "ozprotocol.h" #include "ozeltbuf.h" @@ -51,6 +52,8 @@ static u8 g_session_id; static u16 g_apps = 0x1; static int g_processing_rx; +struct kmem_cache *oz_elt_info_cache; + /* * Context: softirq-serialized */ @@ -479,6 +482,8 @@ void oz_protocol_term(void) } spin_unlock_bh(&g_polling_lock); oz_dbg(ON, "Protocol stopped\n"); + + kmem_cache_destroy(oz_elt_info_cache); } /* @@ -762,6 +767,10 @@ static char *oz_get_next_device_name(char *s, char *dname, int max_size) */ int oz_protocol_init(char *devs) { + oz_elt_info_cache = KMEM_CACHE(oz_elt_info, 0); + if (!oz_elt_info_cache) + return -ENOMEM; + skb_queue_head_init(&g_rx_queue); if (devs[0] == '*') { oz_binding_add(NULL); diff --git a/drivers/staging/ozwpan/ozproto.h b/drivers/staging/ozwpan/ozproto.h index f1d30c4..b0f7459 100644 --- a/drivers/staging/ozwpan/ozproto.h +++ b/drivers/staging/ozwpan/ozproto.h @@ -65,4 +65,6 @@ enum hrtimer_restart oz_pd_timeout_event(struct hrtimer *timer); int oz_get_pd_status_list(char *pd_list, int max_count); int oz_get_binding_list(char *buf, int max_if); +extern struct kmem_cache *oz_elt_info_cache; + #endif /* _OZPROTO_H */ -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 09/10] staging: ozwpan: Use slab cache for oz_tx_frame allocation 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger ` (7 preceding siblings ...) 2014-08-04 12:54 ` [PATCH 08/10] staging: ozwpan: Use slab cache for oz_elt_info allocation Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 2014-08-08 6:01 ` [PATCH 09/10 v2] " Christoph Jaeger 2014-08-04 12:54 ` [PATCH 10/10] staging: ozwpan: Use list helpers Christoph Jaeger 9 siblings, 1 reply; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Use a slab cache rather than rolling our own free list. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozpd.c | 43 +++++++--------------------------------- drivers/staging/ozwpan/ozpd.h | 3 +-- drivers/staging/ozwpan/ozproto.c | 8 ++++++++ drivers/staging/ozwpan/ozproto.h | 1 + 4 files changed, 17 insertions(+), 38 deletions(-) diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index c6fddb8..8048ea3 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -21,8 +21,6 @@ #include <linux/uaccess.h> #include <net/psnap.h> -#define OZ_MAX_TX_POOL_SIZE 6 - static struct oz_tx_frame *oz_tx_frame_alloc(struct oz_pd *pd); static void oz_tx_frame_free(struct oz_pd *pd, struct oz_tx_frame *f); static void oz_tx_isoc_free(struct oz_pd *pd, struct oz_tx_frame *f); @@ -177,13 +175,6 @@ static void oz_pd_free(struct work_struct *work) e = e->next; kfree(fwell); } - /* Deallocate all frames in tx pool. - */ - while (pd->tx_pool) { - e = pd->tx_pool; - pd->tx_pool = e->next; - kfree(container_of(e, struct oz_tx_frame, link)); - } if (pd->net_dev) dev_put(pd->net_dev); kfree(pd); @@ -333,18 +324,10 @@ int oz_pd_sleep(struct oz_pd *pd) */ static struct oz_tx_frame *oz_tx_frame_alloc(struct oz_pd *pd) { - struct oz_tx_frame *f = NULL; + struct oz_tx_frame *f; - spin_lock_bh(&pd->tx_frame_lock); - if (pd->tx_pool) { - f = container_of(pd->tx_pool, struct oz_tx_frame, link); - pd->tx_pool = pd->tx_pool->next; - pd->tx_pool_count--; - } - spin_unlock_bh(&pd->tx_frame_lock); - if (f == NULL) - f = kmalloc(sizeof(struct oz_tx_frame), GFP_ATOMIC); - if (f) { + f = kmem_cache_alloc(oz_tx_frame_cache, GFP_ATOMIC); + if (likely(f)) { f->total_size = sizeof(struct oz_hdr); INIT_LIST_HEAD(&f->link); INIT_LIST_HEAD(&f->elt_list); @@ -359,13 +342,9 @@ static void oz_tx_isoc_free(struct oz_pd *pd, struct oz_tx_frame *f) { pd->nb_queued_isoc_frames--; list_del_init(&f->link); - if (pd->tx_pool_count < OZ_MAX_TX_POOL_SIZE) { - f->link.next = pd->tx_pool; - pd->tx_pool = &f->link; - pd->tx_pool_count++; - } else { - kfree(f); - } + + kmem_cache_free(oz_tx_frame_cache, f); + oz_dbg(TX_FRAMES, "Releasing ISOC Frame isoc_nb= %d\n", pd->nb_queued_isoc_frames); } @@ -375,15 +354,7 @@ static void oz_tx_isoc_free(struct oz_pd *pd, struct oz_tx_frame *f) */ static void oz_tx_frame_free(struct oz_pd *pd, struct oz_tx_frame *f) { - spin_lock_bh(&pd->tx_frame_lock); - if (pd->tx_pool_count < OZ_MAX_TX_POOL_SIZE) { - f->link.next = pd->tx_pool; - pd->tx_pool = &f->link; - pd->tx_pool_count++; - f = NULL; - } - spin_unlock_bh(&pd->tx_frame_lock); - kfree(f); + kmem_cache_free(oz_tx_frame_cache, f); } /* diff --git a/drivers/staging/ozwpan/ozpd.h b/drivers/staging/ozwpan/ozpd.h index 43a26ea..212fab0 100644 --- a/drivers/staging/ozwpan/ozpd.h +++ b/drivers/staging/ozwpan/ozpd.h @@ -90,8 +90,6 @@ struct oz_pd { unsigned max_stream_buffering; int nb_queued_frames; int nb_queued_isoc_frames; - struct list_head *tx_pool; - int tx_pool_count; spinlock_t tx_frame_lock; struct list_head *last_sent_frame; struct list_head tx_queue; @@ -131,5 +129,6 @@ void oz_apps_init(void); void oz_apps_term(void); extern struct kmem_cache *oz_elt_info_cache; +extern struct kmem_cache *oz_tx_frame_cache; #endif /* Sentry */ diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c index 00d245b..c1fb442 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -53,6 +53,7 @@ static u16 g_apps = 0x1; static int g_processing_rx; struct kmem_cache *oz_elt_info_cache; +struct kmem_cache *oz_tx_frame_cache; /* * Context: softirq-serialized @@ -483,6 +484,7 @@ void oz_protocol_term(void) spin_unlock_bh(&g_polling_lock); oz_dbg(ON, "Protocol stopped\n"); + kmem_cache_destroy(oz_tx_frame_cache); kmem_cache_destroy(oz_elt_info_cache); } @@ -771,6 +773,12 @@ int oz_protocol_init(char *devs) if (unlikely(!oz_elt_info_cache)) return -ENOMEM; + oz_tx_frame_cache = KMEM_CACHE(oz_tx_frame, 0); + if (unlikely(!oz_tx_frame_cache)) { + kmem_cache_destroy(oz_elt_info_cache); + return -ENOMEM; + } + skb_queue_head_init(&g_rx_queue); if (devs[0] == '*') { oz_binding_add(NULL); diff --git a/drivers/staging/ozwpan/ozproto.h b/drivers/staging/ozwpan/ozproto.h index b0f7459..73cc69b 100644 --- a/drivers/staging/ozwpan/ozproto.h +++ b/drivers/staging/ozwpan/ozproto.h @@ -66,5 +66,6 @@ int oz_get_pd_status_list(char *pd_list, int max_count); int oz_get_binding_list(char *buf, int max_if); extern struct kmem_cache *oz_elt_info_cache; +extern struct kmem_cache *oz_tx_frame_cache; #endif /* _OZPROTO_H */ -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 09/10 v2] staging: ozwpan: Use slab cache for oz_tx_frame allocation 2014-08-04 12:54 ` [PATCH 09/10] staging: ozwpan: Use slab cache for oz_tx_frame allocation Christoph Jaeger @ 2014-08-08 6:01 ` Christoph Jaeger 0 siblings, 0 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-08 6:01 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Use a slab cache rather than rolling our own free list. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- v2: Don't use likely()/unlikely(). drivers/staging/ozwpan/ozpd.c | 41 ++++++---------------------------------- drivers/staging/ozwpan/ozpd.h | 3 +-- drivers/staging/ozwpan/ozproto.c | 8 ++++++++ drivers/staging/ozwpan/ozproto.h | 1 + 4 files changed, 16 insertions(+), 37 deletions(-) diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index c6fddb8..e849d8a 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -21,8 +21,6 @@ #include <linux/uaccess.h> #include <net/psnap.h> -#define OZ_MAX_TX_POOL_SIZE 6 - static struct oz_tx_frame *oz_tx_frame_alloc(struct oz_pd *pd); static void oz_tx_frame_free(struct oz_pd *pd, struct oz_tx_frame *f); static void oz_tx_isoc_free(struct oz_pd *pd, struct oz_tx_frame *f); @@ -177,13 +175,6 @@ static void oz_pd_free(struct work_struct *work) e = e->next; kfree(fwell); } - /* Deallocate all frames in tx pool. - */ - while (pd->tx_pool) { - e = pd->tx_pool; - pd->tx_pool = e->next; - kfree(container_of(e, struct oz_tx_frame, link)); - } if (pd->net_dev) dev_put(pd->net_dev); kfree(pd); @@ -333,17 +324,9 @@ int oz_pd_sleep(struct oz_pd *pd) */ static struct oz_tx_frame *oz_tx_frame_alloc(struct oz_pd *pd) { - struct oz_tx_frame *f = NULL; + struct oz_tx_frame *f; - spin_lock_bh(&pd->tx_frame_lock); - if (pd->tx_pool) { - f = container_of(pd->tx_pool, struct oz_tx_frame, link); - pd->tx_pool = pd->tx_pool->next; - pd->tx_pool_count--; - } - spin_unlock_bh(&pd->tx_frame_lock); - if (f == NULL) - f = kmalloc(sizeof(struct oz_tx_frame), GFP_ATOMIC); + f = kmem_cache_alloc(oz_tx_frame_cache, GFP_ATOMIC); if (f) { f->total_size = sizeof(struct oz_hdr); INIT_LIST_HEAD(&f->link); @@ -359,13 +342,9 @@ static void oz_tx_isoc_free(struct oz_pd *pd, struct oz_tx_frame *f) { pd->nb_queued_isoc_frames--; list_del_init(&f->link); - if (pd->tx_pool_count < OZ_MAX_TX_POOL_SIZE) { - f->link.next = pd->tx_pool; - pd->tx_pool = &f->link; - pd->tx_pool_count++; - } else { - kfree(f); - } + + kmem_cache_free(oz_tx_frame_cache, f); + oz_dbg(TX_FRAMES, "Releasing ISOC Frame isoc_nb= %d\n", pd->nb_queued_isoc_frames); } @@ -375,15 +354,7 @@ static void oz_tx_isoc_free(struct oz_pd *pd, struct oz_tx_frame *f) */ static void oz_tx_frame_free(struct oz_pd *pd, struct oz_tx_frame *f) { - spin_lock_bh(&pd->tx_frame_lock); - if (pd->tx_pool_count < OZ_MAX_TX_POOL_SIZE) { - f->link.next = pd->tx_pool; - pd->tx_pool = &f->link; - pd->tx_pool_count++; - f = NULL; - } - spin_unlock_bh(&pd->tx_frame_lock); - kfree(f); + kmem_cache_free(oz_tx_frame_cache, f); } /* diff --git a/drivers/staging/ozwpan/ozpd.h b/drivers/staging/ozwpan/ozpd.h index 43a26ea..212fab0 100644 --- a/drivers/staging/ozwpan/ozpd.h +++ b/drivers/staging/ozwpan/ozpd.h @@ -90,8 +90,6 @@ struct oz_pd { unsigned max_stream_buffering; int nb_queued_frames; int nb_queued_isoc_frames; - struct list_head *tx_pool; - int tx_pool_count; spinlock_t tx_frame_lock; struct list_head *last_sent_frame; struct list_head tx_queue; @@ -131,5 +129,6 @@ void oz_apps_init(void); void oz_apps_term(void); extern struct kmem_cache *oz_elt_info_cache; +extern struct kmem_cache *oz_tx_frame_cache; #endif /* Sentry */ diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c index b592e96..db6ef99 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -53,6 +53,7 @@ static u16 g_apps = 0x1; static int g_processing_rx; struct kmem_cache *oz_elt_info_cache; +struct kmem_cache *oz_tx_frame_cache; /* * Context: softirq-serialized @@ -483,6 +484,7 @@ void oz_protocol_term(void) spin_unlock_bh(&g_polling_lock); oz_dbg(ON, "Protocol stopped\n"); + kmem_cache_destroy(oz_tx_frame_cache); kmem_cache_destroy(oz_elt_info_cache); } @@ -771,6 +773,12 @@ int oz_protocol_init(char *devs) if (!oz_elt_info_cache) return -ENOMEM; + oz_tx_frame_cache = KMEM_CACHE(oz_tx_frame, 0); + if (!oz_tx_frame_cache) { + kmem_cache_destroy(oz_elt_info_cache); + return -ENOMEM; + } + skb_queue_head_init(&g_rx_queue); if (devs[0] == '*') { oz_binding_add(NULL); diff --git a/drivers/staging/ozwpan/ozproto.h b/drivers/staging/ozwpan/ozproto.h index b0f7459..73cc69b 100644 --- a/drivers/staging/ozwpan/ozproto.h +++ b/drivers/staging/ozwpan/ozproto.h @@ -66,5 +66,6 @@ int oz_get_pd_status_list(char *pd_list, int max_count); int oz_get_binding_list(char *buf, int max_if); extern struct kmem_cache *oz_elt_info_cache; +extern struct kmem_cache *oz_tx_frame_cache; #endif /* _OZPROTO_H */ -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 10/10] staging: ozwpan: Use list helpers 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger ` (8 preceding siblings ...) 2014-08-04 12:54 ` [PATCH 09/10] staging: ozwpan: Use slab cache for oz_tx_frame allocation Christoph Jaeger @ 2014-08-04 12:54 ` Christoph Jaeger 9 siblings, 0 replies; 17+ messages in thread From: Christoph Jaeger @ 2014-08-04 12:54 UTC (permalink / raw) To: shigekatsu.tateno, gregkh; +Cc: devel, linux-kernel, Christoph Jaeger Make use of the various list helper functions to improve readability. Signed-off-by: Christoph Jaeger <email@christophjaeger.info> --- drivers/staging/ozwpan/ozeltbuf.c | 60 +++++++-------------- drivers/staging/ozwpan/ozhcd.c | 96 +++++++++++----------------------- drivers/staging/ozwpan/ozpd.c | 106 ++++++++++++-------------------------- drivers/staging/ozwpan/ozproto.c | 15 ++---- 4 files changed, 88 insertions(+), 189 deletions(-) diff --git a/drivers/staging/ozwpan/ozeltbuf.c b/drivers/staging/ozwpan/ozeltbuf.c index 81580cb..64d9fab 100644 --- a/drivers/staging/ozwpan/ozeltbuf.c +++ b/drivers/staging/ozwpan/ozeltbuf.c @@ -27,24 +27,12 @@ void oz_elt_buf_init(struct oz_elt_buf *buf) */ void oz_elt_buf_term(struct oz_elt_buf *buf) { - struct list_head *e; - int i; + struct oz_elt_info *ei, *n; - /* Free any elements in the order or isoc lists. */ - for (i = 0; i < 2; i++) { - struct list_head *list; - if (i) - list = &buf->order_list; - else - list = &buf->isoc_list; - e = list->next; - while (e != list) { - struct oz_elt_info *ei = - container_of(e, struct oz_elt_info, link_order); - e = e->next; - kfree(ei); - } - } + list_for_each_entry_safe(ei, n, &buf->isoc_list, link_order) + kfree(ei); + list_for_each_entry_safe(ei, n, &buf->order_list, link_order) + kfree(ei); } /* @@ -77,16 +65,11 @@ void oz_elt_info_free(struct oz_elt_buf *buf, struct oz_elt_info *ei) */ void oz_elt_info_free_chain(struct oz_elt_buf *buf, struct list_head *list) { - struct list_head *e; + struct oz_elt_info *ei, *n; - e = list->next; spin_lock_bh(&buf->lock); - while (e != list) { - struct oz_elt_info *ei; - ei = container_of(e, struct oz_elt_info, link); - e = e->next; + list_for_each_entry_safe(ei, n, list->next, link) oz_elt_info_free(buf, ei); - } spin_unlock_bh(&buf->lock); } @@ -111,14 +94,13 @@ int oz_elt_stream_create(struct oz_elt_buf *buf, u8 id, int max_buf_count) int oz_elt_stream_delete(struct oz_elt_buf *buf, u8 id) { - struct list_head *e; + struct list_head *e, *n; struct oz_elt_stream *st = NULL; oz_dbg(ON, "%s: (0x%x)\n", __func__, id); spin_lock_bh(&buf->lock); - e = buf->stream_list.next; - while (e != &buf->stream_list) { - st = container_of(e, struct oz_elt_stream, link); + list_for_each(e, &buf->stream_list) { + st = list_entry(e, struct oz_elt_stream, link); if (st->id == id) { list_del(e); break; @@ -129,11 +111,9 @@ int oz_elt_stream_delete(struct oz_elt_buf *buf, u8 id) spin_unlock_bh(&buf->lock); return -1; } - e = st->elt_list.next; - while (e != &st->elt_list) { + list_for_each_safe(e, n, &st->elt_list) { struct oz_elt_info *ei = - container_of(e, struct oz_elt_info, link); - e = e->next; + list_entry(e, struct oz_elt_info, link); list_del_init(&ei->link); list_del_init(&ei->link_order); st->buf_count -= ei->length; @@ -173,7 +153,7 @@ int oz_queue_elt_info(struct oz_elt_buf *buf, u8 isoc, u8 id, if (id) { list_for_each(e, &buf->stream_list) { - st = container_of(e, struct oz_elt_stream, link); + st = list_entry(e, struct oz_elt_stream, link); if (st->id == id) break; } @@ -228,22 +208,18 @@ int oz_select_elts_for_tx(struct oz_elt_buf *buf, u8 isoc, unsigned *len, unsigned max_len, struct list_head *list) { int count = 0; - struct list_head *e; struct list_head *el; - struct oz_elt_info *ei; + struct oz_elt_info *ei, *n; spin_lock_bh(&buf->lock); if (isoc) el = &buf->isoc_list; else el = &buf->order_list; - e = el->next; - while (e != el) { - struct oz_app_hdr *app_hdr; - ei = container_of(e, struct oz_elt_info, link_order); - e = e->next; + + list_for_each_entry_safe(ei, n, el, link_order) { if ((*len + ei->length) <= max_len) { - app_hdr = (struct oz_app_hdr *) + struct oz_app_hdr *app_hdr = (struct oz_app_hdr *) &ei->data[sizeof(struct oz_elt)]; app_hdr->elt_seq_num = buf->tx_seq_num[ei->app_id]++; if (buf->tx_seq_num[ei->app_id] == 0) @@ -271,5 +247,5 @@ int oz_select_elts_for_tx(struct oz_elt_buf *buf, u8 isoc, unsigned *len, int oz_are_elts_available(struct oz_elt_buf *buf) { - return buf->order_list.next != &buf->order_list; + return !list_empty(&buf->order_list); } diff --git a/drivers/staging/ozwpan/ozhcd.c b/drivers/staging/ozwpan/ozhcd.c index 3b603c5..0f7fa69 100644 --- a/drivers/staging/ozwpan/ozhcd.c +++ b/drivers/staging/ozwpan/ozhcd.c @@ -45,10 +45,6 @@ */ #define OZ_PLAT_DEV_NAME "ozwpan" -/* Get endpoint object from the containing link. - */ -#define ep_from_link(__e) container_of((__e), struct oz_endpoint, link) - /*EP0 timeout before ep0 request is again added to TX queue. (13*8 = 98mSec) */ #define EP0_TIMEOUT_COUNTER 13 @@ -308,12 +304,10 @@ static struct oz_urb_link *oz_uncancel_urb(struct oz_hcd *ozhcd, struct urb *urb) { struct oz_urb_link *urbl; - struct list_head *e; - list_for_each(e, &ozhcd->urb_cancel_list) { - urbl = container_of(e, struct oz_urb_link, link); + list_for_each_entry(urbl, &ozhcd->urb_cancel_list, link) { if (urb == urbl->urb) { - list_del_init(e); + list_del_init(&urbl->link); return urbl; } } @@ -372,10 +366,9 @@ static void oz_complete_urb(struct usb_hcd *hcd, struct urb *urb, static void oz_ep_free(struct oz_port *port, struct oz_endpoint *ep) { if (port) { - struct list_head list; + LIST_HEAD(list); struct oz_hcd *ozhcd = port->ozhcd; - INIT_LIST_HEAD(&list); if (ep->flags & OZ_F_EP_HAVE_STREAM) oz_usb_stream_delete(port->hpd, ep->ep_num); /* Transfer URBs to the orphanage while we hold the lock. */ @@ -521,7 +514,7 @@ static int oz_dequeue_ep_urb(struct oz_port *port, u8 ep_addr, int in_dir, struct list_head *e; list_for_each(e, &ep->urb_list) { - urbl = container_of(e, struct oz_urb_link, link); + urbl = list_entry(e, struct oz_urb_link, link); if (urbl->urb == urb) { list_del_init(e); break; @@ -553,7 +546,7 @@ static struct urb *oz_find_urb_by_id(struct oz_port *port, int ep_ix, struct list_head *e; list_for_each(e, &ep->urb_list) { - urbl = container_of(e, struct oz_urb_link, link); + urbl = list_entry(e, struct oz_urb_link, link); if (urbl->req_id == req_id) { urb = urbl->urb; list_del_init(e); @@ -1046,21 +1039,17 @@ int oz_hcd_heartbeat(void *hport) int rc = 0; struct oz_port *port = (struct oz_port *)hport; struct oz_hcd *ozhcd = port->ozhcd; - struct oz_urb_link *urbl; - struct list_head xfr_list; - struct list_head *e; - struct list_head *n; + struct oz_urb_link *urbl, *n; + LIST_HEAD(xfr_list); struct urb *urb; struct oz_endpoint *ep; struct timespec ts, delta; getrawmonotonic(&ts); - INIT_LIST_HEAD(&xfr_list); /* Check the OUT isoc endpoints to see if any URB data can be sent. */ spin_lock_bh(&ozhcd->hcd_lock); - list_for_each(e, &port->isoc_out_ep) { - ep = ep_from_link(e); + list_for_each_entry(ep, &port->isoc_out_ep, link) { if (ep->credit < 0) continue; delta = timespec_sub(ts, ep->timestamp); @@ -1083,10 +1072,9 @@ int oz_hcd_heartbeat(void *hport) spin_unlock_bh(&ozhcd->hcd_lock); /* Send to PD and complete URBs. */ - list_for_each_safe(e, n, &xfr_list) { - urbl = container_of(e, struct oz_urb_link, link); + list_for_each_entry_safe(urbl, n, &xfr_list, link) { urb = urbl->urb; - list_del_init(e); + list_del_init(&urbl->link); urb->error_count = 0; urb->start_frame = oz_usb_get_frame_number(); oz_usb_send_isoc(port->hpd, urbl->ep_num, urb); @@ -1096,9 +1084,7 @@ int oz_hcd_heartbeat(void *hport) /* Check the IN isoc endpoints to see if any URBs can be completed. */ spin_lock_bh(&ozhcd->hcd_lock); - list_for_each(e, &port->isoc_in_ep) { - struct oz_endpoint *ep = ep_from_link(e); - + list_for_each_entry(ep, &port->isoc_in_ep, link) { if (ep->flags & OZ_F_EP_BUFFERING) { if (ep->buffered_units >= OZ_IN_BUFFERING_UNITS) { ep->flags &= ~OZ_F_EP_BUFFERING; @@ -1111,10 +1097,7 @@ int oz_hcd_heartbeat(void *hport) delta = timespec_sub(ts, ep->timestamp); ep->credit += div_u64(timespec_to_ns(&delta), NSEC_PER_MSEC); ep->timestamp = ts; - while (!list_empty(&ep->urb_list)) { - struct oz_urb_link *urbl = - list_first_entry(&ep->urb_list, - struct oz_urb_link, link); + list_for_each_entry_safe(urbl, n, &ep->urb_list, link) { struct urb *urb = urbl->urb; int len = 0; int copy_len; @@ -1161,10 +1144,9 @@ int oz_hcd_heartbeat(void *hport) spin_unlock_bh(&ozhcd->hcd_lock); /* Complete the filled URBs. */ - list_for_each_safe(e, n, &xfr_list) { - urbl = container_of(e, struct oz_urb_link, link); + list_for_each_entry_safe(urbl, n, &xfr_list, link) { urb = urbl->urb; - list_del_init(e); + list_del_init(&urbl->link); oz_free_urb_link(urbl); oz_complete_urb(port->ozhcd->hcd, urb, 0); } @@ -1173,15 +1155,11 @@ int oz_hcd_heartbeat(void *hport) */ ep = port->out_ep[0]; if (ep) { - struct list_head *e; - struct list_head *n; - spin_lock_bh(&ozhcd->hcd_lock); - list_for_each_safe(e, n, &ep->urb_list) { - urbl = container_of(e, struct oz_urb_link, link); + list_for_each_entry_safe(urbl, n, &ep->urb_list, link) { if (urbl->submit_counter > EP0_TIMEOUT_COUNTER) { oz_dbg(ON, "Request 0x%p timeout\n", urbl->urb); - list_move_tail(e, &xfr_list); + list_move_tail(&urbl->link, &xfr_list); urbl->submit_counter = 0; } else { urbl->submit_counter++; @@ -1190,10 +1168,7 @@ int oz_hcd_heartbeat(void *hport) if (!list_empty(&ep->urb_list)) rc = 1; spin_unlock_bh(&ozhcd->hcd_lock); - e = xfr_list.next; - while (e != &xfr_list) { - urbl = container_of(e, struct oz_urb_link, link); - e = e->next; + list_for_each_entry_safe(urbl, n, &xfr_list, link) { oz_dbg(ON, "Resending request to PD\n"); oz_process_ep0_urb(ozhcd, urbl->urb, GFP_ATOMIC); oz_free_urb_link(urbl); @@ -1292,12 +1267,12 @@ static void oz_clean_endpoints_for_interface(struct usb_hcd *hcd, struct oz_hcd *ozhcd = port->ozhcd; unsigned mask; int i; - struct list_head ep_list; + LIST_HEAD(ep_list); + struct oz_endpoint *ep, *n; oz_dbg(ON, "Deleting endpoints for interface %d\n", if_ix); if (if_ix >= port->num_iface) return; - INIT_LIST_HEAD(&ep_list); spin_lock_bh(&ozhcd->hcd_lock); mask = port->iface[if_ix].ep_mask; port->iface[if_ix].ep_mask = 0; @@ -1321,9 +1296,7 @@ static void oz_clean_endpoints_for_interface(struct usb_hcd *hcd, } } spin_unlock_bh(&ozhcd->hcd_lock); - while (!list_empty(&ep_list)) { - struct oz_endpoint *ep = - list_first_entry(&ep_list, struct oz_endpoint, link); + list_for_each_entry_safe(ep, n, &ep_list, link) { list_del_init(&ep->link); oz_ep_free(port, ep); } @@ -1594,6 +1567,7 @@ static void oz_urb_process_tasklet(unsigned long unused) unsigned long irq_state; struct urb *urb; struct oz_hcd *ozhcd = oz_hcd_claim(); + struct oz_urb_link *urbl, *n; int rc = 0; if (ozhcd == NULL) @@ -1603,10 +1577,7 @@ static void oz_urb_process_tasklet(unsigned long unused) * appropriately while removing urbs. */ spin_lock_irqsave(&g_tasklet_lock, irq_state); - while (!list_empty(&ozhcd->urb_pending_list)) { - struct oz_urb_link *urbl = - list_first_entry(&ozhcd->urb_pending_list, - struct oz_urb_link, link); + list_for_each_entry_safe(urbl, n, &ozhcd->urb_pending_list, link) { list_del_init(&urbl->link); spin_unlock_irqrestore(&g_tasklet_lock, irq_state); urb = urbl->urb; @@ -1651,7 +1622,7 @@ static void oz_urb_cancel(struct oz_port *port, u8 ep_num, struct urb *urb) */ spin_lock_irqsave(&g_tasklet_lock, irq_state); list_for_each(e, &ozhcd->urb_cancel_list) { - urbl = container_of(e, struct oz_urb_link, link); + urbl = list_entry(e, struct oz_urb_link, link); if (urb == urbl->urb) { list_del_init(e); spin_unlock_irqrestore(&g_tasklet_lock, irq_state); @@ -1665,7 +1636,7 @@ static void oz_urb_cancel(struct oz_port *port, u8 ep_num, struct urb *urb) */ spin_lock_irqsave(&ozhcd->hcd_lock, irq_state); list_for_each(e, &ozhcd->orphanage) { - urbl = container_of(e, struct oz_urb_link, link); + urbl = list_entry(e, struct oz_urb_link, link); if (urbl->urb == urb) { list_del(e); oz_dbg(ON, "Found urb in orphanage\n"); @@ -1695,15 +1666,13 @@ static void oz_urb_cancel_tasklet(unsigned long unused) { unsigned long irq_state; struct urb *urb; + struct oz_urb_link *urbl, *n; struct oz_hcd *ozhcd = oz_hcd_claim(); if (ozhcd == NULL) return; spin_lock_irqsave(&g_tasklet_lock, irq_state); - while (!list_empty(&ozhcd->urb_cancel_list)) { - struct oz_urb_link *urbl = - list_first_entry(&ozhcd->urb_cancel_list, - struct oz_urb_link, link); + list_for_each_entry_safe(urbl, n, &ozhcd->urb_cancel_list, link) { list_del_init(&urbl->link); spin_unlock_irqrestore(&g_tasklet_lock, irq_state); urb = urbl->urb; @@ -1722,11 +1691,9 @@ static void oz_urb_cancel_tasklet(unsigned long unused) static void oz_hcd_clear_orphanage(struct oz_hcd *ozhcd, int status) { if (ozhcd) { - struct oz_urb_link *urbl; + struct oz_urb_link *urbl, *n; - while (!list_empty(&ozhcd->orphanage)) { - urbl = list_first_entry(&ozhcd->orphanage, - struct oz_urb_link, link); + list_for_each_entry_safe(urbl, n, &ozhcd->orphanage, link) { list_del(&urbl->link); oz_complete_urb(ozhcd->hcd, urbl->urb, status); oz_free_urb_link(urbl); @@ -1824,14 +1791,13 @@ static struct oz_urb_link *oz_remove_urb(struct oz_endpoint *ep, struct urb *urb) { struct oz_urb_link *urbl; - struct list_head *e; if (unlikely(ep == NULL)) return NULL; - list_for_each(e, &ep->urb_list) { - urbl = container_of(e, struct oz_urb_link, link); + + list_for_each_entry(urbl, &ep->urb_list, link) { if (urbl->urb == urb) { - list_del_init(e); + list_del_init(&urbl->link); if (usb_pipeisoc(urb->pipe)) { ep->credit -= urb->number_of_packets; if (ep->credit < 0) diff --git a/drivers/staging/ozwpan/ozpd.c b/drivers/staging/ozwpan/ozpd.c index 8048ea3..0dc475e 100644 --- a/drivers/staging/ozwpan/ozpd.c +++ b/drivers/staging/ozwpan/ozpd.c @@ -137,10 +137,7 @@ struct oz_pd *oz_pd_alloc(const u8 *mac_addr) */ static void oz_pd_free(struct work_struct *work) { - struct list_head *e; - struct oz_tx_frame *f; - struct oz_isoc_stream *st; - struct oz_farewell *fwell; + struct list_head *e, *n; struct oz_pd *pd; oz_pd_dbg(pd, ON, "Destroying PD\n"); @@ -148,33 +145,24 @@ static void oz_pd_free(struct work_struct *work) /*Disable timer tasklets*/ tasklet_kill(&pd->heartbeat_tasklet); tasklet_kill(&pd->timeout_tasklet); - /* Delete any streams. - */ - e = pd->stream_list.next; - while (e != &pd->stream_list) { - st = container_of(e, struct oz_isoc_stream, link); - e = e->next; - oz_isoc_stream_free(st); - } - /* Free any queued tx frames. - */ - e = pd->tx_queue.next; - while (e != &pd->tx_queue) { - f = container_of(e, struct oz_tx_frame, link); - e = e->next; + + /* Free streams, queued tx frames and farewells. */ + + list_for_each_safe(e, n, &pd->stream_list) + oz_isoc_stream_free(list_entry(e, struct oz_isoc_stream, link)); + + list_for_each_safe(e, n, &pd->tx_queue) { + struct oz_tx_frame *f = list_entry(e, struct oz_tx_frame, link); if (f->skb != NULL) kfree_skb(f->skb); oz_retire_frame(pd, f); } + oz_elt_buf_term(&pd->elt_buff); - /* Free any farewells. - */ - e = pd->farewell_list.next; - while (e != &pd->farewell_list) { - fwell = container_of(e, struct oz_farewell, link); - e = e->next; - kfree(fwell); - } + + list_for_each_safe(e, n, &pd->farewell_list) + kfree(list_entry(e, struct oz_farewell, link)); + if (pd->net_dev) dev_put(pd->net_dev); kfree(pd); @@ -418,7 +406,7 @@ static struct sk_buff *oz_build_frame(struct oz_pd *pd, struct oz_tx_frame *f) struct net_device *dev = pd->net_dev; struct oz_hdr *oz_hdr; struct oz_elt *elt; - struct list_head *e; + struct oz_elt_info *ei; /* Allocate skb with enough space for the lower layers as well * as the space we need. @@ -443,9 +431,7 @@ static struct sk_buff *oz_build_frame(struct oz_pd *pd, struct oz_tx_frame *f) /* Copy the elements into the frame body. */ elt = (struct oz_elt *)(oz_hdr+1); - for (e = f->elt_list.next; e != &f->elt_list; e = e->next) { - struct oz_elt_info *ei; - ei = container_of(e, struct oz_elt_info, link); + list_for_each_entry(ei, &f->elt_list, link) { memcpy(elt, ei->data, ei->length); elt = oz_next_elt(elt); } @@ -460,13 +446,9 @@ fail: */ static void oz_retire_frame(struct oz_pd *pd, struct oz_tx_frame *f) { - struct list_head *e; - struct oz_elt_info *ei; + struct oz_elt_info *ei, *n; - e = f->elt_list.next; - while (e != &f->elt_list) { - ei = container_of(e, struct oz_elt_info, link); - e = e->next; + list_for_each_entry_safe(ei, n, &f->elt_list, link) { list_del_init(&ei->link); if (ei->callback) ei->callback(pd, ei->context); @@ -492,7 +474,7 @@ static int oz_send_next_queued_frame(struct oz_pd *pd, int more_data) spin_unlock(&pd->tx_frame_lock); return -1; } - f = container_of(e, struct oz_tx_frame, link); + f = list_entry(e, struct oz_tx_frame, link); if (f->skb != NULL) { skb = f->skb; @@ -580,15 +562,13 @@ static int oz_send_isoc_frame(struct oz_pd *pd) struct net_device *dev = pd->net_dev; struct oz_hdr *oz_hdr; struct oz_elt *elt; - struct list_head *e; - struct list_head list; + struct oz_elt_info *ei; + LIST_HEAD(list); int total_size = sizeof(struct oz_hdr); - INIT_LIST_HEAD(&list); - oz_select_elts_for_tx(&pd->elt_buff, 1, &total_size, pd->max_tx_size, &list); - if (list.next == &list) + if (list_empty(&list)) return 0; skb = alloc_skb(total_size + OZ_ALLOCATED_SPACE(dev), GFP_ATOMIC); if (skb == NULL) { @@ -610,9 +590,7 @@ static int oz_send_isoc_frame(struct oz_pd *pd) oz_hdr->last_pkt_num = pd->trigger_pkt_num & OZ_LAST_PN_MASK; elt = (struct oz_elt *)(oz_hdr+1); - for (e = list.next; e != &list; e = e->next) { - struct oz_elt_info *ei; - ei = container_of(e, struct oz_elt_info, link); + list_for_each_entry(ei, &list, link) { memcpy(elt, ei->data, ei->length); elt = oz_next_elt(elt); } @@ -626,41 +604,30 @@ static int oz_send_isoc_frame(struct oz_pd *pd) */ void oz_retire_tx_frames(struct oz_pd *pd, u8 lpn) { - struct list_head *e; - struct oz_tx_frame *f; - struct list_head *first = NULL; - struct list_head *last = NULL; + struct oz_tx_frame *f, *tmp = NULL; u8 diff; u32 pkt_num; + LIST_HEAD(list); + spin_lock(&pd->tx_frame_lock); - e = pd->tx_queue.next; - while (e != &pd->tx_queue) { - f = container_of(e, struct oz_tx_frame, link); + list_for_each_entry(f, &pd->tx_queue, link) { pkt_num = le32_to_cpu(get_unaligned(&f->hdr.pkt_num)); diff = (lpn - (pkt_num & OZ_LAST_PN_MASK)) & OZ_LAST_PN_MASK; if ((diff > OZ_LAST_PN_HALF_CYCLE) || (pkt_num == 0)) break; oz_dbg(TX_FRAMES, "Releasing pkt_num= %u, nb= %d\n", pkt_num, pd->nb_queued_frames); - if (first == NULL) - first = e; - last = e; - e = e->next; + tmp = f; pd->nb_queued_frames--; } - if (first) { - last->next->prev = &pd->tx_queue; - pd->tx_queue.next = last->next; - last->next = NULL; - } + if (tmp) + list_cut_position(&list, &pd->tx_queue, &tmp->link); pd->last_sent_frame = &pd->tx_queue; spin_unlock(&pd->tx_frame_lock); - while (first) { - f = container_of(first, struct oz_tx_frame, link); - first = first->next; + + list_for_each_entry_safe(f, tmp, &list, link) oz_retire_frame(pd, f); - } } /* @@ -669,11 +636,9 @@ void oz_retire_tx_frames(struct oz_pd *pd, u8 lpn) */ static struct oz_isoc_stream *pd_stream_find(struct oz_pd *pd, u8 ep_num) { - struct list_head *e; struct oz_isoc_stream *st; - list_for_each(e, &pd->stream_list) { - st = container_of(e, struct oz_isoc_stream, link); + list_for_each_entry(st, &pd->stream_list, link) { if (st->ep_num == ep_num) return st; } @@ -810,14 +775,11 @@ int oz_send_isoc_unit(struct oz_pd *pd, u8 ep_num, const u8 *data, int len) struct oz_tx_frame *isoc_unit = NULL; int nb = pd->nb_queued_isoc_frames; if (nb >= pd->isoc_latency) { - struct list_head *e; struct oz_tx_frame *f; oz_dbg(TX_FRAMES, "Dropping ISOC Unit nb= %d\n", nb); spin_lock(&pd->tx_frame_lock); - list_for_each(e, &pd->tx_queue) { - f = container_of(e, struct oz_tx_frame, - link); + list_for_each_entry(f, &pd->tx_queue, link) { if (f->skb != NULL) { oz_tx_isoc_free(pd, f); break; diff --git a/drivers/staging/ozwpan/ozproto.c b/drivers/staging/ozwpan/ozproto.c index c1fb442..fc010ae 100644 --- a/drivers/staging/ozwpan/ozproto.c +++ b/drivers/staging/ozwpan/ozproto.c @@ -185,7 +185,7 @@ static struct oz_pd *oz_connect_req(struct oz_pd *cur_pd, struct oz_elt *elt, getnstimeofday(&pd->last_rx_timestamp); spin_lock_bh(&g_polling_lock); list_for_each(e, &g_pd_list) { - pd2 = container_of(e, struct oz_pd, link); + pd2 = list_entry(e, struct oz_pd, link); if (ether_addr_equal(pd2->mac_addr, pd_addr)) { free_pd = pd; pd = pd2; @@ -601,13 +601,11 @@ void oz_pd_request_heartbeat(struct oz_pd *pd) struct oz_pd *oz_pd_find(const u8 *mac_addr) { struct oz_pd *pd; - struct list_head *e; spin_lock_bh(&g_polling_lock); - list_for_each(e, &g_pd_list) { - pd = container_of(e, struct oz_pd, link); + list_for_each_entry(pd, &g_pd_list, link) { if (ether_addr_equal(pd->mac_addr, mac_addr)) { - atomic_inc(&pd->ref_count); + oz_pd_get(pd); spin_unlock_bh(&g_polling_lock); return pd; } @@ -700,11 +698,10 @@ void oz_binding_add(const char *net_dev) */ static void pd_stop_all_for_device(struct net_device *net_dev) { - struct list_head h; + LIST_HEAD(h); struct oz_pd *pd; struct oz_pd *n; - INIT_LIST_HEAD(&h); spin_lock_bh(&g_polling_lock); list_for_each_entry_safe(pd, n, &g_pd_list, link) { if (pd->net_dev == net_dev) { @@ -799,14 +796,12 @@ int oz_protocol_init(char *devs) int oz_get_pd_list(struct oz_mac_addr *addr, int max_count) { struct oz_pd *pd; - struct list_head *e; int count = 0; spin_lock_bh(&g_polling_lock); - list_for_each(e, &g_pd_list) { + list_for_each_entry(pd, &g_pd_list, link) { if (count >= max_count) break; - pd = container_of(e, struct oz_pd, link); ether_addr_copy((u8 *)&addr[count++], pd->mac_addr); } spin_unlock_bh(&g_polling_lock); -- 1.9.1 ^ permalink raw reply related [flat|nested] 17+ messages in thread
end of thread, other threads:[~2014-08-10 12:11 UTC | newest] Thread overview: 17+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-08-04 12:54 [PATCH 00/10] staging: Clean up ozwpan driver Christoph Jaeger 2014-08-04 12:54 ` [PATCH 01/10] staging: ozwpan: Add module parameter description Christoph Jaeger 2014-08-04 12:54 ` [PATCH 02/10] staging: ozwpan: Fix typo in typedef Christoph Jaeger 2014-08-10 4:42 ` Greg KH 2014-08-04 12:54 ` [PATCH 03/10] staging: ozwpan: Remove unused OZ_MAX_TIMER_POOL_SIZE Christoph Jaeger 2014-08-04 12:54 ` [PATCH 04/10] staging: ozwpan: Remove redundant initialization Christoph Jaeger 2014-08-04 12:54 ` [PATCH 05/10] staging: ozwpan: Remove dead code Christoph Jaeger 2014-08-04 12:54 ` [PATCH 06/10] staging: ozwpan: Simplify app interface Christoph Jaeger 2014-08-05 11:13 ` Dan Carpenter 2014-08-04 12:54 ` [PATCH 07/10] staging: ozwpan: Use slab cache for oz_urb_link allocation Christoph Jaeger 2014-08-05 11:18 ` Dan Carpenter 2014-08-08 5:59 ` [PATCH 07/10 v2] " Christoph Jaeger 2014-08-04 12:54 ` [PATCH 08/10] staging: ozwpan: Use slab cache for oz_elt_info allocation Christoph Jaeger 2014-08-08 6:00 ` [PATCH 08/10 v2] " Christoph Jaeger 2014-08-04 12:54 ` [PATCH 09/10] staging: ozwpan: Use slab cache for oz_tx_frame allocation Christoph Jaeger 2014-08-08 6:01 ` [PATCH 09/10 v2] " Christoph Jaeger 2014-08-04 12:54 ` [PATCH 10/10] staging: ozwpan: Use list helpers Christoph Jaeger
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox