Skip to content

Commit

Permalink
opal-msg: Pass return value to callback handler
Browse files Browse the repository at this point in the history
Kernel calls opal_get_msg() API to read OPAL message. In this path OPAL
calls "callback" handler to inform caller that kernel read the opal
message. It assumes that read is always success. This assumption was
fine as message was always fixed size.

Next patch introduces variable size opal message. In that situation
opal_get_msg() may fail due to insufficient buffer size (ex: old kernel
and new OPAL combination). So lets add `return value` parameter to
"callback" handler. So that caller knows kernel didn't read the
message and take appropriate action.

Cc: Jeremy Kerr <jk@ozlabs.org>
Cc: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Cc: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Acked-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
  • Loading branch information
Vasant Hegde authored and stewartsmith committed Jun 3, 2019
1 parent bc5584c commit ec9f67b
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 20 deletions.
16 changes: 8 additions & 8 deletions core/opal-msg.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2013-2014 IBM Corp.
/* Copyright 2013-2019 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -24,7 +24,7 @@

struct opal_msg_entry {
struct list_node link;
void (*consumed)(void *data);
void (*consumed)(void *data, int status);
void *data;
struct opal_msg msg;
};
Expand All @@ -35,8 +35,8 @@ static LIST_HEAD(msg_pending_list);
static struct lock opal_msg_lock = LOCK_UNLOCKED;

int _opal_queue_msg(enum opal_msg_type msg_type, void *data,
void (*consumed)(void *data), size_t num_params,
const u64 *params)
void (*consumed)(void *data, int status),
size_t num_params, const u64 *params)
{
struct opal_msg_entry *entry;

Expand Down Expand Up @@ -75,7 +75,7 @@ int _opal_queue_msg(enum opal_msg_type msg_type, void *data,
static int64_t opal_get_msg(uint64_t *buffer, uint64_t size)
{
struct opal_msg_entry *entry;
void (*callback)(void *data);
void (*callback)(void *data, int status);
void *data;

if (size < sizeof(struct opal_msg) || !buffer)
Expand Down Expand Up @@ -103,7 +103,7 @@ static int64_t opal_get_msg(uint64_t *buffer, uint64_t size)
unlock(&opal_msg_lock);

if (callback)
callback(data);
callback(data, OPAL_SUCCESS);

return OPAL_SUCCESS;
}
Expand All @@ -113,7 +113,7 @@ static int64_t opal_check_completion(uint64_t *buffer, uint64_t size,
uint64_t token)
{
struct opal_msg_entry *entry, *next_entry;
void (*callback)(void *data) = NULL;
void (*callback)(void *data, int status) = NULL;
int rc = OPAL_BUSY;
void *data = NULL;

Expand Down Expand Up @@ -142,7 +142,7 @@ static int64_t opal_check_completion(uint64_t *buffer, uint64_t size,
unlock(&opal_msg_lock);

if (callback)
callback(data);
callback(data, OPAL_SUCCESS);

return rc;

Expand Down
5 changes: 3 additions & 2 deletions core/test/run-msg.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2013-2014 IBM Corp.
/* Copyright 2013-2019 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -61,8 +61,9 @@ void opal_update_pending_evt(uint64_t evt_mask, uint64_t evt_values)
}

static long magic = 8097883813087437089UL;
static void callback(void *data)
static void callback(void *data, int status)
{
assert(status == OPAL_SUCCESS);
assert(*(uint64_t *)data == magic);
}

Expand Down
6 changes: 3 additions & 3 deletions hw/fsp/fsp-mem-err.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2013-2014 IBM Corp.
/* Copyright 2013-2019 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -84,7 +84,7 @@ static bool send_response_to_fsp(u32 cmd_sub_mod)
* in that case, at least until we clarify a bit better how
* we want to handle things.
*/
static void queue_event_for_delivery(void *data __unused)
static void queue_event_for_delivery(void *data __unused, int staus __unused)
{
struct fsp_mem_err_node *entry;
uint64_t *merr_data;
Expand Down Expand Up @@ -144,7 +144,7 @@ static int queue_mem_err_node(struct OpalMemoryErrorData *merr_evt)
unlock(&mem_err_lock);

/* Queue up the event for delivery to OS. */
queue_event_for_delivery(NULL);
queue_event_for_delivery(NULL, OPAL_SUCCESS);
return 0;
}

Expand Down
4 changes: 2 additions & 2 deletions hw/occ.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2013-2017 IBM Corp.
/* Copyright 2013-2019 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -853,7 +853,7 @@ static bool cpu_pstates_prepare_core(struct proc_chip *chip,
}

static bool occ_opal_msg_outstanding = false;
static void occ_msg_consumed(void *data __unused)
static void occ_msg_consumed(void *data __unused, int status __unused)
{
lock(&occ_lock);
occ_opal_msg_outstanding = false;
Expand Down
4 changes: 2 additions & 2 deletions hw/prd.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2014-2015 IBM Corp.
/* Copyright 2014-2019 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -81,7 +81,7 @@ static uint64_t prd_ipoll_mask;

static void send_next_pending_event(void);

static void prd_msg_consumed(void *data)
static void prd_msg_consumed(void *data, int status __unused)
{
struct opal_prd_msg *msg = data;
uint32_t proc;
Expand Down
6 changes: 3 additions & 3 deletions include/opal-msg.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright 2013-2014 IBM Corp.
/* Copyright 2013-2019 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -31,8 +31,8 @@
#define OPAL_MSG_SIZE (64 * 1024)

int _opal_queue_msg(enum opal_msg_type msg_type, void *data,
void (*consumed)(void *data), size_t num_params,
const u64 *params);
void (*consumed)(void *data, int status),
size_t num_params, const u64 *params);

#define opal_queue_msg(msg_type, data, cb, ...) \
_opal_queue_msg(msg_type, data, cb, \
Expand Down

0 comments on commit ec9f67b

Please sign in to comment.