From: Mauro Carvalho Chehab <mchehab@redhat.com>
To: "Hiremath, Vaibhav" <hvaibhav@ti.com>
Cc: Andrey Mandychev <andreymandychev@gmail.com>,
"Taneja, Archit" <archit@ti.com>,
"Valkeinen, Tomi" <tomi.valkeinen@ti.com>,
"Semwal, Sumit" <sumit.semwal@ti.com>,
"linux-media@vger.kernel.org" <linux-media@vger.kernel.org>,
Andrei Mandychev <andrei.mandychev@parrot.com>
Subject: Re: [PATCH] Fixed list_del corruption in videobuf-core.c : videobuf_queue_cancel()
Date: Thu, 25 Oct 2012 11:34:35 -0200 [thread overview]
Message-ID: <20121025113435.69e4e96f@redhat.com> (raw)
In-Reply-To: <79CD15C6BA57404B839C016229A409A83EB3A67D@DBDE01.ent.ti.com>
Hi Vaibhav/Andrei,
Em Tue, 9 Oct 2012 17:32:25 +0000
"Hiremath, Vaibhav" <hvaibhav@ti.com> escreveu:
> On Tue, Oct 09, 2012 at 14:08:18, Andrey Mandychev wrote:
> > Hi,
> >
> > Please find below some additional comments.
> >
> > Actually it's not a real issue. It's more warning than issue. When you
> > are trying to delete element from the queue the implementation of
> > list_del (in list_debug.c) checks that previous element and next element
> > of the element you are going to delete reference to this element
> > properly. In other words the method checks the integrity of the queue
> > before deleting the element and it generates warning if something is
> > wrong. In my case the head looses a pointer to the next element because
> > of INIT_LIST_HEAD()
> > and when we try to delete this element from the
> > queue the list_del() generates warning because the previous element
> > (i.e. head) doesn't reference to this element (element we want to
> > delete).
> >
> > void __list_del_entry(struct list_head *entry)
> > {
> > struct list_head *prev, *next;
> >
> > prev = entry->prev;
> > next = entry->next;
> >
> > if (WARN(next == LIST_POISON1,
> > "list_del corruption, %p->next is LIST_POISON1 (%p)\n",
> > entry, LIST_POISON1) ||
> > WARN(prev == LIST_POISON2,
> > "list_del corruption, %p->prev is LIST_POISON2 (%p)\n",
> > entry, LIST_POISON2) ||
> > WARN(prev->next != entry,
> > "list_del corruption. prev->next should be %p, "
> > "but was %p\n", entry, prev->next) ||
> > WARN(next->prev != entry,
> > "list_del corruption. next->prev should be %p, "
> > "but was %p\n", entry, next->prev))
> > return;
> >
> > __list_del(prev, next);
> > }
> >
> > So my patch is a small improvement that avoids generating this kind of
> > warning.
> >
>
> Any mechanism or suggestion to reproduce this issue, which I can
> use to reproduce this issue. Just switching between LCD<=>TV, will be enough
> to hit this issue?
>
> Thanks,
> Vaibhav
> > --
> > BR,
> > Andrei
> >
> >
> > On Mon, Oct 8, 2012 at 4:50 PM, Hiremath, Vaibhav <hvaibhav@ti.com>
> > wrote:
> >
> >
> > On Fri, Oct 05, 2012 at 21:14:25, Andrei Mandychev wrote:
> > > If there is a buffer with VIDEOBUF_QUEUED state it won't be
> > deleted properly
> > > because the head of queue loses its elements by calling
> > INIT_LIST_HEAD()
> > > before videobuf_streamoff().
> >
> >
> > "dma_queue" is driver internal queue and videobuf_streamoff()
> > function
> > will end up into buf_release() callback, which in our case
> > doesn't do
> > anything with dmaqueue.
> >
> >
> > Did you face any runtime issues with this? I still did not
> > understand
> > about this corruption thing.
> >
> > Thanks,
> > Vaibhav
> >
> > > ---
> > > drivers/media/video/omap/omap_vout.c | 2 +-
> > > 1 file changed, 1 insertion(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/media/video/omap/omap_vout.c
> > b/drivers/media/video/omap/omap_vout.c
> > > index 409da0f..f02eb8e 100644
> > > --- a/drivers/media/video/omap/omap_vout.c
> > > +++ b/drivers/media/video/omap/omap_vout.c
> > > @@ -1738,8 +1738,8 @@ static int vidioc_streamoff(struct file
> > *file, void *fh, enum v4l2_buf_type i)
> > > v4l2_err(&vout->vid_dev->v4l2_dev, "failed to
> > change mode in"
> > > " streamoff\n");
> > >
> > > - INIT_LIST_HEAD(&vout->dma_queue);
> > > ret = videobuf_streamoff(&vout->vbq);
> > > + INIT_LIST_HEAD(&vout->dma_queue);
Why do we ever need to call INIT_LIST_HEAD() here in the first place?
List initialization should happen only once, when vout is created.
After that, list add/del macros should be used.
Having a code like this here seems to indicate that there are something
wrong somewhere.
Regards,
Mauro
prev parent reply other threads:[~2012-10-25 13:34 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-05 15:44 [PATCH] Fixed list_del corruption in videobuf-core.c : videobuf_queue_cancel() Andrei Mandychev
2012-10-08 14:50 ` Hiremath, Vaibhav
2012-10-08 15:39 ` Andrei Mandychev
[not found] ` <CAH9bG+Cp8gURyZ=cc3doCd_TR2CzLMrcKSGMKpe55jmCNYr+KQ@mail.gmail.com>
2012-10-09 17:32 ` Hiremath, Vaibhav
2012-10-25 13:34 ` Mauro Carvalho Chehab [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121025113435.69e4e96f@redhat.com \
--to=mchehab@redhat.com \
--cc=andrei.mandychev@parrot.com \
--cc=andreymandychev@gmail.com \
--cc=archit@ti.com \
--cc=hvaibhav@ti.com \
--cc=linux-media@vger.kernel.org \
--cc=sumit.semwal@ti.com \
--cc=tomi.valkeinen@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.