[rtems commit] leon, grspw_pkt: Added checks for special list cases

Daniel Hellstrom danielh at rtems.org
Mon Mar 6 06:58:44 UTC 2017


Module:    rtems
Branch:    master
Commit:    ef94150f41909cd680473a7e2b2e36ca9c195c8c
Changeset: http://git.rtems.org/rtems/commit/?id=ef94150f41909cd680473a7e2b2e36ca9c195c8c

Author:    Daniel Hellstrom <daniel at gaisler.com>
Date:      Tue Apr 12 13:53:42 2016 +0200

leon, grspw_pkt: Added checks for special list cases

- Fixed grspw_dma_tx_send() so that it does not fail when an empty user packet
  is provided.
- Added empty checks on some of the list handling inline functions for
  GRSPW_PKT. Their use by the driver may be correct already, but the user might
  not have been aware of the assumptions that certain lists had to be non-empty.

---

 c/src/lib/libbsp/sparc/shared/include/grspw_pkt.h | 9 +++++++++
 c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c     | 4 ++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/c/src/lib/libbsp/sparc/shared/include/grspw_pkt.h b/c/src/lib/libbsp/sparc/shared/include/grspw_pkt.h
index 995d8bd..3a079c5 100644
--- a/c/src/lib/libbsp/sparc/shared/include/grspw_pkt.h
+++ b/c/src/lib/libbsp/sparc/shared/include/grspw_pkt.h
@@ -648,6 +648,9 @@ grspw_list_prepend(struct grspw_list *list, struct grspw_pkt *pkt)
 static inline void
 grspw_list_append_list(struct grspw_list *list, struct grspw_list *alist)
 {
+	if (grspw_list_is_empty(alist)) {
+		return;
+	}
 	alist->tail->next = NULL;
 	if ( list->tail == NULL ) {
 		list->head = alist->head;
@@ -660,6 +663,9 @@ grspw_list_append_list(struct grspw_list *list, struct grspw_list *alist)
 static inline void
 grspw_list_prepend_list(struct grspw_list *list, struct grspw_list *alist)
 {
+	if (grspw_list_is_empty(alist)) {
+		return;
+	}
 	if ( list->head == NULL ) {
 		list->tail = alist->tail;
 		alist->tail->next = NULL;
@@ -673,6 +679,9 @@ grspw_list_prepend_list(struct grspw_list *list, struct grspw_list *alist)
 static inline void
 grspw_list_remove_head_list(struct grspw_list *list, struct grspw_list *dlist)
 {
+	if (grspw_list_is_empty(dlist)) {
+		return;
+	}
 	list->head = dlist->tail->next;
 	if ( list->head == NULL ) {
 		list->tail = NULL;
diff --git a/c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c b/c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c
index 5f40853..cfeebe4 100644
--- a/c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c
+++ b/c/src/lib/libbsp/sparc/shared/spw/grspw_pkt.c
@@ -1841,7 +1841,7 @@ int grspw_dma_tx_send(void *c, int opts, struct grspw_list *pkts, int count)
 		grspw_tx_process_scheduled(dma);
 
 	/* 2. Add the requested packets to the SEND List (USER->SEND) */
-	if (pkts) {
+	if (pkts && (count > 0)) {
 		grspw_list_append_list(&dma->send, pkts);
 		dma->send_cnt += count;
 		if (dma->stats.send_cnt_max < dma->send_cnt)
@@ -3104,7 +3104,7 @@ static int grspw_common_init(void)
 		if (rtems_task_start(grspw_work_task, grspw_work_func, 0) !=
 		    RTEMS_SUCCESSFUL)
 			return -1;
-	}
+}
 
 	grspw_initialized = 1;
 	return 0;



More information about the vc mailing list