static int __init testfunc(void) { unsigned char buf[6]; unsigned char i, j; unsigned int ret; printk(KERN_INFO "[fifo]byte stream fifo test start\n"); /* put string into the fifo */ kfifo_in(&test, "hello", 5); /* put values into the fifo */ for (i = 0; i != 10; i++) kfifo_put(&test, &i); /* show the number of used elements */ printk(KERN_INFO "[fifo]fifo len: %u\n", kfifo_len(&test)); /* get max of 5 bytes from the fifo */ i = kfifo_out(&test, buf, 5); printk(KERN_INFO "[fifo]buf: %.*s\n", i, buf); /* get max of 2 elements from the fifo */ ret = kfifo_out(&test, buf, 2); printk(KERN_INFO "[fifo]ret: %d\n", ret); /* and put it back to the end of the fifo */ ret = kfifo_in(&test, buf, ret); printk(KERN_INFO "[fifo]ret: %d\n", ret); /* skip first element of the fifo */ printk(KERN_INFO "[fifo]skip 1st element\n"); kfifo_skip(&test); /* put values into the fifo until is full */ for (i = 20; kfifo_put(&test, &i); i++) ; printk(KERN_INFO "[fifo]queue len: %u\n", kfifo_len(&test)); /* show the first value without removing from the fifo */ if (kfifo_peek(&test, &i)) printk(KERN_INFO "[fifo]%d\n", i); /* check the correctness of all values in the fifo */ j = 0; while (kfifo_get(&test, &i)) { printk(KERN_INFO "item = %d\n", i); if (i != expected_result[j++]) { printk(KERN_WARNING "value mismatch: test failed\n"); return -EIO; } } if (j != ARRAY_SIZE(expected_result)) { printk(KERN_WARNING "size mismatch: test failed\n"); return -EIO; } printk(KERN_INFO "[fifo]test passed\n"); return 0; }
int test(void) { struct kfifo fifo; int ret, tam; char *buf; /* Inicializo la cola y compruebo errores */ ret = kfifo_alloc(&fifo, FIFO_SIZE, GFP_KERNEL); if (ret) { printk(KERN_ERR "error kfifo_alloc\n"); return ret; } /* Introduzco la cadena Hello en la cola */ kfifo_in(&fifo, "Hello", 5); /* Introduzco la cadena LIN de la cola */ kfifo_in(&fifo, "LIN", 3); /* Extraigo la cadena Hello de la cola */ tam = kfifo_out(&fifo, buf, 5); printk(KERN_INFO "%s", buf); /* Devuelvo la cadena LIN sin extraerla de la cola */ if (kfifo_peek(&test, buf)) printk(KERN_INFO " %s\n", buf); /* Elimino la cola */ kfifo_free(&test); return 0; }
static int do_write_work_in(struct threadrw_write_task *task) { struct threadrw_buf *rwbuf = NULL; int ret; int need_re_write = 0; int write_len = 0; unsigned long flags; if (kfifo_is_empty(&task->datafifo)) return 0; if (!kfifo_peek(&task->datafifo, (void *)&rwbuf)) return 0; if (task->codec_mm_buffer && !rwbuf->write_off) codec_mm_dma_flush(rwbuf->vbuffer, rwbuf->data_size, DMA_TO_DEVICE); ret = task->write(task->file, task->sbuf, (const char __user *)rwbuf->dma_handle + rwbuf->write_off, rwbuf->data_size, 3); /* noblock,phy addr */ if (ret == -EAGAIN) { need_re_write = 0; /*do later retry. */ } else if (ret >= rwbuf->data_size) { write_len += rwbuf->data_size; if (kfifo_get(&task->datafifo, (void *)&rwbuf)) { rwbuf->data_size = 0; kfifo_put(&task->freefifo, (const void *)rwbuf); /*wakeup write thread. */ wake_up_interruptible(&task->wq); } else pr_err("write ok,but kfifo_get data failed.!!!\n"); need_re_write = 1; } else if (ret > 0) { rwbuf->data_size -= ret; /* half data write */ rwbuf->write_off += ret; write_len += ret; need_re_write = 1; } else { /*ret <=0 */ pr_err("get errors ret=%d size=%d\n", ret, rwbuf->data_size); task->errors = ret; } if (write_len > 0) { task->passed_data_len += write_len; spin_lock_irqsave(&task->lock, flags); task->buffered_data_size -= write_len; spin_unlock_irqrestore(&task->lock, flags); } return need_re_write; }
static int __init testfunc(void) { int buf[6]; int i, j; unsigned int ret; printk(KERN_INFO "int fifo test start\n"); for (i = 0; i != 10; i++) kfifo_put(&test, &i); printk(KERN_INFO "fifo len: %u\n", kfifo_len(&test)); ret = kfifo_out(&test, buf, 2); printk(KERN_INFO "ret: %d\n", ret); ret = kfifo_in(&test, buf, ret); printk(KERN_INFO "ret: %d\n", ret); printk(KERN_INFO "skip 1st element\n"); kfifo_skip(&test); for (i = 20; kfifo_put(&test, &i); i++) ; printk(KERN_INFO "queue len: %u\n", kfifo_len(&test)); if (kfifo_peek(&test, &i)) printk(KERN_INFO "%d\n", i); j = 0; while (kfifo_get(&test, &i)) { printk(KERN_INFO "item = %d\n", i); if (i != expected_result[j++]) { printk(KERN_WARNING "value mismatch: test failed\n"); return -EIO; } } if (j != ARRAY_SIZE(expected_result)) { printk(KERN_WARNING "size mismatch: test failed\n"); return -EIO; } printk(KERN_INFO "test passed\n"); return 0; }