only one element get stored in kfifo
chrishell
chris at chrishell.de
Tue Oct 11 13:39:17 EDT 2022
I got it. The correct way to pull out a struct from the kfifo, could be:
rc = kfifo_out(&pfops->mymod_fifo, &r_cache1, sizeof(struct
mymod_data_pkt));
BR Christian
> hello, Im struggle with a simple kfifo. I try to do it dynamicly. For
> the sake of simplicity I changed the code in a way that everything with
> the kfifo is done in the open function of my module.
>
> First of all, I have a struct, in which I store the pointer to that kfifo:
>
> struct mymod_private_fops {
> wait_queue_head_t wait;
> struct kfifo mymod_fifo;
> }
>
>
> And the struct in which I store my data:
>
> struct mymod_data_pkt {
> __u8 mbyte;
> __u8 smfunc;
> ktime_t ktime;
> __u16 len;
> __u16 sequence;
> char devname[32]
> void *page;
> };
>
>
> this is the open function, which creates the kfifo and stores the
> pointer to that kfifo for later usage. As I mentioned I simplified the
> whole thing to have the store operation into the kfifo and the fetch
> operation, out of the kfifo in one place. Initially I did this in the
> read and write function.
>
> static int mymod_open(struct inode *pinode, struct file *pfile)
> {
> int rc = 0,
> len = 0;
>
> struct mymod_private_fops pfops;
> struct mymod_data_pkt w_cache1, w_cache2, w_cache3 r_cache1,
> r_cache2, r_cache3;
>
> pfops = kzalloc(sizeof(struct mymod_private_fops), GFP_KERNEL);
>
> if(pfops == NULL)
> return -ENOMEM;
>
> init_waitqueue_head(&pfops->wait);
>
> len = LOG_STACK_SIZE * sizeof(struct mymod_data_pkt);
>
> rc = kfifo_alloc(&pfops->mymod_fifo, len, GFP_KERNEL);
> if(rc) {
> pr_err("kfifo_alloc failed %d", rc);
> return rc;
> }
>
> if(! kfifo_initialized(&pfops->mymod_fifo)) {
> pr_err("kfifo initialized");
> }
>
> w_cache1.mbyte = 4;
> w_cache1.len = 245;
>
> rc = kfifo_in(&pfops->mymod_fifo, &w_cache1, sizeof(struct
> mymod_data_pkt));
> pr_err("kfifo_in returns %d", rc);
>
> w_cache2.mbyte = 42;
> w_cache2.len = 112;
>
> rc = kfifo_in(&pfops->mymod_fifo, &w_cache2, sizeof(struct
> mymod_data_pkt));
> pr_err("kfifo_in returns %d", rc);
>
> w_cache3.mbyte = 119;
> w_cache3.len = 77;
>
> rc = kfifo_in(&pfops->mymod_fifo, &w_cache3, sizeof(struct
> mymod_data_pkt));
> pr_err("kfifo_in returns %d", rc);
>
> rc = kfifo_len(&pfops->mymod_fifo);
> pr_err("kfifo_len: %d", rc);
>
> memset(&r_cache1, 0, sizeof(struct mymod_data_pkt));
>
> rc = kfifo_get(&pfops->mymod_fifo, &r_cache1);
> pr_err("kfifo_get returns %d", rc);
>
> pr_err("content of kfifo r_cache1->mbyte: %d", r_cache1.mbyte);
>
> memset(&r_cache2, 0, sizeof(struct mymod_data_pkt));
>
> rc = kfifo_get(&pfops->mymod_fifo, &r_cache2);
> pr_err("kfifo_get returns %d", rc);
>
> pr_err("content of kfifo r_cache2->mbyte: %d", r_cache2.mbyte);
>
> ...
>
> pfile->private_data = pfops;
>
> ...
>
> [ 108.200977] kfifo_in returns 64
> [ 108.200985] kfifo_in returns 64
> [ 108.200990] kfifo_in returns 64
> [ 108.200993] kfifo_len: 192
> [ 108.200997] kfifo_get returns 1
> [ 108.201000] content of kfifo r_cache1->mbyte: 4
> [ 108.201003] kfifo_get returns 1
> [ 108.201006] content of kfifo r_cache2->mbyte: 0
> [ 108.201010] kfifo_get returns 1
> [ 108.201013] content of kfifo r_cache3->mbyte: 0
>
> The initialization worked fine, the store operations went properly. Only
> pulling data out of the kfifo didn't work
> as expected.
> Only the 1st element was correct, the 2nd and 3rd element was just 0
>
> Also the size of the struct and the fifo seems to be okay. The struct
> has the size of 64 (there is some padding within I think) and after
> inserting 3 elements the kfifo has the size of 192
>
> Where is the flaw here?
>
>
> Thank you in advance
>
> Best regards Christian
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>
More information about the Kernelnewbies
mailing list