[Intel-gfx] [PATCH 02/15] mei: add support to GSC extended header
Winkler, Tomas
tomas.winkler at intel.com
Tue Aug 16 20:49:54 UTC 2022
> -----Original Message-----
> From: Teres Alexis, Alan Previn <alan.previn.teres.alexis at intel.com>
> Sent: Thursday, August 04, 2022 01:08
> To: Ceraolo Spurio, Daniele <daniele.ceraolospurio at intel.com>; intel-
> gfx at lists.freedesktop.org
> Cc: Winkler, Tomas <tomas.winkler at intel.com>; Lubart, Vitaly
> <vitaly.lubart at intel.com>
> Subject: Re: [PATCH 02/15] mei: add support to GSC extended header
>
> I was informed by Daniele that the MEI team had done the functional
> reviews as part of their differentiated "Signed-of- by" process and so i was
> asked to only do a at the surface code-syntax / code-structure review.
>
> That said i did find one issue farther below.
>
> I'm also compelled to add the following nit, but this is about prior code, not
> new code in these patches so you can choose to ignore this: In
> mei_cl_irq_write, mei_cl_write and mei_cl_irq_read_msg functions, there
> are multiple blocks of code that reference header-index, header-lenght,
> buffer-data, buffer-size, dr-slots and other ptr + sizing related variables in
> different layers to decide validity of data, validity of size, ability for splitting
> data or extending via dma-rings and other code flows I can't really make out.
> It would be nice to have separate helpers with self-explanatory names and
> added comments about what these blocks of code are trying to do and how
> they interact with the e2e flow of sending data or receiving data via the irq
> and message lists.
Thanks for the input, will try to address that comment, in later patches.
>
>
> ...alan
>
>
> On Thu, 2022-06-09 at 16:19 -0700, Ceraolo Spurio, Daniele wrote:
> > From: Tomas Winkler <tomas.winkler at intel.com>
> >
> > GSC extend header is of variable size and data is provided in a sgl
> > list inside the header and not in the data buffers, need to enable the
> > path.
> >
> > diff --git a/drivers/misc/mei/interrupt.c
> > b/drivers/misc/mei/interrupt.c index 0706322154cb..0a0e984e5673 100644
> > --- a/drivers/misc/mei/interrupt.c
> > +++ b/drivers/misc/mei/interrupt.c
> > @@ -98,9 +98,12 @@ static int mei_cl_irq_read_msg(struct mei_cl *cl,
> > struct mei_device *dev = cl->dev;
> > struct mei_cl_cb *cb;
> >
> > + struct mei_ext_hdr_vtag *vtag_hdr = NULL;
> > + struct mei_ext_hdr_gsc_f2h *gsc_f2h = NULL;
> > +
> > size_t buf_sz;
> > u32 length;
> > - int ext_len;
> > + u32 ext_len;
> >
> > length = mei_hdr->length;
> > ext_len = 0;
> > @@ -122,18 +125,24 @@ static int mei_cl_irq_read_msg(struct mei_cl *cl,
> > }
> >
> > if (mei_hdr->extended) {
> > - struct mei_ext_hdr *ext;
> > - struct mei_ext_hdr_vtag *vtag_hdr = NULL;
> > -
> > - ext = mei_ext_begin(meta);
> > + struct mei_ext_hdr *ext = mei_ext_begin(meta);
> > do {
> > switch (ext->type) {
> > case MEI_EXT_HDR_VTAG:
> > vtag_hdr = (struct mei_ext_hdr_vtag *)ext;
> > break;
> > + case MEI_EXT_HDR_GSC:
> > + gsc_f2h = (struct mei_ext_hdr_gsc_f2h
> *)ext;
> > + cb->ext_hdr = kzalloc(sizeof(*gsc_f2h),
> GFP_KERNEL);
> > + if (!cb->ext_hdr) {
> > + cb->status = -ENOMEM;
> > + goto discard;
> > + }
> > + break;
> > case MEI_EXT_HDR_NONE:
> > fallthrough;
> > default:
> > + cl_err(dev, cl, "unknown extended
> header\n");
> > cb->status = -EPROTO;
> > break;
> > }
> > @@ -157,6 +168,28 @@ static int mei_cl_irq_read_msg(struct mei_cl *cl,
> > cb->vtag = vtag_hdr->vtag;
> > }
> >
> > + if (gsc_f2h) {
> > + u32 ext_hdr_len = mei_ext_hdr_len(&gsc_f2h->hdr);
> > +
> > + if (!dev->hbm_f_gsc_supported) {
> > + cl_err(dev, cl, "gsc extended header is not
> supported\n");
> > + cb->status = -EPROTO;
> > + goto discard;
> >
> Alan: It looks to me that code jump where "discard" begins, puts cb back into
> a linked list for future re-use.
> However, it doesn't free cb->ext_hdr (or at least from what i can tell). Thus,
> if we already allocated cb->ext_hdr (from above when "case
> MEI_EXT_HDR_GSC:" is true, and if we end up discarding here or in the
> following few lines, then we may end up leaking memory if we dont free cb-
> >ext_hdr between discard and next reuse.
The cb is not reused, it is put on the completion list, all completed cbs freed via
mei_io_cb_free() function which also frees the ext_hdr.
> > + }
> > +
> > + if (length) {
> > + cl_err(dev, cl, "no data allowed in cb with gsc\n");
> > + cb->status = -EPROTO;
> > + goto discard;
> > + }
> > + if (ext_hdr_len > sizeof(*gsc_f2h)) {
> > + cl_err(dev, cl, "gsc extended header is too big %u\n",
> ext_hdr_len);
> > + cb->status = -EPROTO;
> > + goto discard;
> > + }
> > + memcpy(cb->ext_hdr, gsc_f2h, ext_hdr_len);
> > + }
> > +
> > if (!mei_cl_is_connected(cl)) {
> > cl_dbg(dev, cl, "not connected\n");
> > cb->status = -ENODEV;
> > diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
> > index 7c508bca9a00..862190b297aa 100644
> > --- a/drivers/misc/mei/mei_dev.h
> > +++ b/drivers/misc/mei/mei_dev.h
> > @@ -211,6 +211,7 @@ struct mei_cl_cb {
> > int status;
> > u32 internal:1;
> > u32 blocking:1;
> > + struct mei_ext_hdr *ext_hdr;
> > };
> >
More information about the Intel-gfx
mailing list