From: Ira Weiny <ira.weiny@intel.com>
To: Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Ira Weiny <ira.weiny@intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>,
Navneet Singh <navneet.singh@intel.com>,
Fan Ni <fan.ni@samsung.com>, Davidlohr Bueso <dave@stgolabs.net>,
Dave Jiang <dave.jiang@intel.com>,
Alison Schofield <alison.schofield@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
<linux-cxl@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH RFC v2 10/18] cxl/mem: Handle DCD add and release capacity events.
Date: Tue, 5 Sep 2023 16:49:25 -0700 [thread overview]
Message-ID: <64f7be8553587_1e8e782946e@iweiny-mobl.notmuch> (raw)
In-Reply-To: <20230829165930.0000208c@Huawei.com>
Jonathan Cameron wrote:
> On Mon, 28 Aug 2023 22:21:01 -0700
> Ira Weiny <ira.weiny@intel.com> wrote:
>
> > A Dynamic Capacity Device (DCD) utilizes events to signal the host about
> > the changes to the allocation of Dynamic Capacity (DC) extents. The
> > device communicates the state of DC extents through an extent list that
> > describes the starting DPA, length, and meta data of the blocks the host
> > can access.
> >
> > Process the dynamic capacity add and release events. The addition or
> > removal of extents can occur at any time. Adding asynchronous memory is
> > straight forward. Also remember the host is under no obligation to
> > respond to a release event until it is done with the memory. Introduce
> > extent kref's to handle the delay of extent release.
> >
> > In the case of a force removal, access to the memory will fail and may
> > cause a crash. However, the extent tracking object is preserved for the
> > region to safely tear down as long as the memory is not accessed.
> >
> > Signed-off-by: Navneet Singh <navneet.singh@intel.com>
> > Co-developed-by: Ira Weiny <ira.weiny@intel.com>
> > Signed-off-by: Ira Weiny <ira.weiny@intel.com>
> Minor stuff inline.
>
>
> > +static int cxl_prepare_ext_list(struct cxl_mbox_dc_response **res,
> > + int *n, struct range *extent)
> > +{
> > + struct cxl_mbox_dc_response *dc_res;
> > + unsigned int size;
> > +
> > + if (!extent)
> > + size = struct_size(dc_res, extent_list, 0);
>
> This is confusing as if you did have *n > 0 I'd kind of expect
> this to just not extend the list rather than shortening it.
> Now I guess that never happens, but locally it looks odd.
>
> Maybe just handle that case in a separate function as it doesn't
> share much code with the case where there is an extent and I would
> assume we always know at the caller which one we want.
Yea I forget why I left this alone. I did not care for it during internal
review and I think I got so busy with the other code that this just got
left behind.
Frankly this is a candidate for the __free() magic as well. But in a
helper function which handles sending the response...
This needs some refactoring for sure... :-/
>
>
> > + else
> > + size = struct_size(dc_res, extent_list, *n + 1);
>
> Might be clearer with a local variable for the number of extents.
>
> extents_count = *n;
>
> if (extent)
> extents_count++;
>
> size = struct_size(dc_res, extent_list, extents_count);
>
> Though I'm not sure that really helps. Maybe this will just need
> to be a little confusing :)
Actually no. IIRC the original idea was to have a running response data
structure realloc'ed as events were processed from the log and then to
send out a final large response... But in my refactoring I did not do
that. The refactoring processes each event (extent) before going on to
the next event. I suppose this may be an issue later if large numbers
of extents are added to the logs rapidly and the processing is not fast
enough and the logs overflow.
But I don't think the complexity is warranted at this time. Especially
because under that condition the size of the response needs to be
contained within mds->payload_size. So there is quite a bit more
complexity there that I don't think was accounted for initially.
I think cxl_send_dc_cap_response() should handle this allocation (using
__free() magic) and then do the send all in 1 function.
I'll refactor and see how it goes.
>
> > +
> > + dc_res = krealloc(*res, size, GFP_KERNEL);
> > + if (!dc_res)
> > + return -ENOMEM;
> > +
> > + if (extent) {
> > + dc_res->extent_list[*n].dpa_start = cpu_to_le64(extent->start);
> > + memset(dc_res->extent_list[*n].reserved, 0, 8);
> > + dc_res->extent_list[*n].length = cpu_to_le64(range_len(extent));
> > + (*n)++;
> > + }
> > +
> > + *res = dc_res;
> > + return 0;
> > +}
>
> > +
> > +/* Returns 0 if the event was handled successfully. */
> > +static int cxl_handle_dcd_event_records(struct cxl_memdev_state *mds,
> > + struct cxl_event_record_raw *rec)
> > +{
> > + struct dcd_event_dyn_cap *record = (struct dcd_event_dyn_cap *)rec;
> > + uuid_t *id = &rec->hdr.id;
> > + int rc;
> > +
> > + if (!uuid_equal(id, &dc_event_uuid))
> > + return -EINVAL;
> > +
> > + switch (record->data.event_type) {
> > + case DCD_ADD_CAPACITY:
> > + rc = cxl_handle_dcd_add_event(mds, &record->data.extent);
> > + break;
>
> I guess it might not be consistent with local style...
> return cxl_handle_dcd_add_event() etc
Sure. That is cleaner. Done.
Ira
>
> > + case DCD_RELEASE_CAPACITY:
> > + case DCD_FORCED_CAPACITY_RELEASE:
> > + rc = cxl_handle_dcd_release_event(mds, &record->data.extent);
> > + break;
> > + default:
> > + return -EINVAL;
> > + }
> > +
> > + return rc;
> > +}
> > +
>
>
next prev parent reply other threads:[~2023-09-05 23:49 UTC|newest]
Thread overview: 97+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-29 5:20 [PATCH RFC v2 00/18] DCD: Add support for Dynamic Capacity Devices (DCD) Ira Weiny
2023-08-29 5:20 ` [PATCH RFC v2 01/18] cxl/hdm: Debug, use decoder name function Ira Weiny
2023-08-29 14:03 ` Jonathan Cameron
2023-08-29 21:48 ` Fan Ni
2023-09-03 2:55 ` Ira Weiny
2023-08-30 20:32 ` Dave Jiang
2023-08-29 5:20 ` [PATCH RFC v2 02/18] cxl/mbox: Flag support for Dynamic Capacity Devices (DCD) Ira Weiny
2023-08-29 14:07 ` Jonathan Cameron
2023-09-03 3:38 ` Ira Weiny
2023-08-29 21:49 ` Fan Ni
2023-08-30 20:33 ` Dave Jiang
2023-10-24 16:16 ` Jonathan Cameron
2023-08-29 5:20 ` [PATCH RFC v2 03/18] cxl/mem: Read Dynamic capacity configuration from the device ira.weiny
2023-08-29 14:37 ` Jonathan Cameron
2023-09-03 23:36 ` Ira Weiny
2023-08-30 21:01 ` Dave Jiang
2023-09-05 0:14 ` Ira Weiny
2023-09-08 20:23 ` Ira Weiny
2023-08-30 21:44 ` Fan Ni
2023-09-08 22:52 ` Ira Weiny
2023-09-12 21:32 ` Fan Ni
2023-09-07 15:46 ` Alison Schofield
2023-09-12 1:18 ` Ira Weiny
2023-09-08 12:46 ` Jørgen Hansen
2023-09-11 20:26 ` Ira Weiny
2023-08-29 5:20 ` [PATCH RFC v2 04/18] cxl/region: Add Dynamic Capacity decoder and region modes Ira Weiny
2023-08-29 14:39 ` Jonathan Cameron
2023-08-30 21:13 ` Dave Jiang
2023-08-31 17:00 ` Fan Ni
2023-08-29 5:20 ` [PATCH RFC v2 05/18] cxl/port: Add Dynamic Capacity mode support to endpoint decoders Ira Weiny
2023-08-29 14:49 ` Jonathan Cameron
2023-09-05 0:05 ` Ira Weiny
2023-08-31 17:25 ` Fan Ni
2023-09-08 23:26 ` Ira Weiny
2023-08-29 5:20 ` [PATCH RFC v2 06/18] cxl/port: Add Dynamic Capacity size " Ira Weiny
2023-08-29 15:09 ` Jonathan Cameron
2023-09-05 4:32 ` Ira Weiny
2023-08-29 5:20 ` [PATCH RFC v2 07/18] cxl/mem: Expose device dynamic capacity configuration ira.weiny
2023-08-29 15:14 ` Jonathan Cameron
2023-09-05 17:55 ` Fan Ni
2023-09-05 20:45 ` Ira Weiny
2023-08-30 22:46 ` Dave Jiang
2023-09-08 23:22 ` Ira Weiny
2023-08-29 5:20 ` [PATCH RFC v2 08/18] cxl/region: Add Dynamic Capacity CXL region support Ira Weiny
2023-08-29 15:19 ` Jonathan Cameron
2023-08-30 23:27 ` Dave Jiang
2023-09-06 4:36 ` Ira Weiny
2023-09-05 21:09 ` Fan Ni
2023-08-29 5:21 ` [PATCH RFC v2 09/18] cxl/mem: Read extents on memory device discovery Ira Weiny
2023-08-29 15:26 ` Jonathan Cameron
2023-08-30 0:16 ` Ira Weiny
2023-09-05 21:41 ` Ira Weiny
2023-08-29 5:21 ` [PATCH RFC v2 10/18] cxl/mem: Handle DCD add and release capacity events Ira Weiny
2023-08-29 15:59 ` Jonathan Cameron
2023-09-05 23:49 ` Ira Weiny [this message]
2023-08-31 17:28 ` Dave Jiang
2023-09-08 15:35 ` Ira Weiny
2023-08-29 5:21 ` [PATCH RFC v2 11/18] cxl/region: Expose DC extents on region driver load Ira Weiny
2023-08-29 16:20 ` Jonathan Cameron
2023-09-06 3:36 ` Ira Weiny
2023-08-31 18:38 ` Dave Jiang
2023-09-08 23:57 ` Ira Weiny
2023-08-29 5:21 ` [PATCH RFC v2 12/18] cxl/region: Notify regions of DC changes Ira Weiny
2023-08-29 16:40 ` Jonathan Cameron
2023-09-06 4:00 ` Ira Weiny
2023-09-18 13:56 ` Jørgen Hansen
2023-09-18 17:45 ` Ira Weiny
2023-08-29 5:21 ` [PATCH RFC v2 13/18] dax/bus: Factor out dev dax resize logic Ira Weiny
2023-08-30 11:27 ` Jonathan Cameron
2023-09-06 4:12 ` Ira Weiny
2023-08-31 21:48 ` Dave Jiang
2023-08-29 5:21 ` [PATCH RFC v2 14/18] dax/region: Support DAX device creation on dynamic DAX regions Ira Weiny
2023-08-30 11:50 ` Jonathan Cameron
2023-09-06 4:35 ` Ira Weiny
2023-09-12 16:49 ` Jonathan Cameron
2023-09-12 22:08 ` Ira Weiny
2023-09-12 22:35 ` Dan Williams
2023-09-13 17:30 ` Ira Weiny
2023-09-13 17:59 ` Dan Williams
2023-09-13 19:26 ` Ira Weiny
2023-09-14 10:32 ` Jonathan Cameron
2023-08-29 5:21 ` [PATCH RFC v2 15/18] cxl/mem: Trace Dynamic capacity Event Record ira.weiny
2023-08-29 16:46 ` Jonathan Cameron
2023-09-06 4:07 ` Ira Weiny
2023-08-29 5:21 ` [PATCH RFC v2 16/18] tools/testing/cxl: Make event logs dynamic Ira Weiny
2023-08-30 12:11 ` Jonathan Cameron
2023-09-06 21:15 ` Ira Weiny
2023-08-29 5:21 ` [PATCH RFC v2 17/18] tools/testing/cxl: Add DC Regions to mock mem data Ira Weiny
2023-08-30 12:20 ` Jonathan Cameron
2023-09-06 21:18 ` Ira Weiny
2023-08-31 23:19 ` Dave Jiang
2023-08-29 5:21 ` [PATCH RFC v2 18/18] tools/testing/cxl: Add Dynamic Capacity events Ira Weiny
2023-08-30 12:23 ` Jonathan Cameron
2023-09-06 21:39 ` Ira Weiny
2023-08-31 23:20 ` Dave Jiang
2023-09-07 21:01 ` [PATCH RFC v2 00/18] DCD: Add support for Dynamic Capacity Devices (DCD) Fan Ni
2023-09-12 1:44 ` Ira Weiny
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=64f7be8553587_1e8e782946e@iweiny-mobl.notmuch \
--to=ira.weiny@intel.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=alison.schofield@intel.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=fan.ni@samsung.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=navneet.singh@intel.com \
--cc=vishal.l.verma@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox