Message ID | 513AB3C9.6010302@linux.vnet.ibm.com |
---|---|
State | Superseded, archived |
Headers | show |
On Fri, Mar 08, 2013 at 10:00:09PM -0600, Nathan Fontenot wrote: > From: Jesse Larrew <jlarrew@linux.vnet.ibm.com> > > A PRRN event is signaled via the RTAS event-scan mechanism, which > returns a Hot Plug Event message "fixed part" indicating "Platform > Resource Reassignment". In response to the Hot Plug Event message, > we must call ibm,update-nodes to determine which resources were > reassigned and then ibm,update-properties to obtain the new affinity > information about those resources. > > The PRRN event-scan RTAS message contains only the "fixed part" with > the "Type" field set to the value 160 and no Extended Event Log. The > four-byte Extended Event Log Length field is repurposed (since no > Extended Event Log message is included) to pass the "scope" parameter > that causes the ibm,update-nodes to return the nodes affected by the > specific resource reassignment. > > This patch adds a handler in rtasd for PRRN RTAS events. The function > pseries_devicetree_update() (from mobility.c) is used to make the > ibm,update-nodes/ibm,update-properties RTAS calls. Updating the NUMA maps > (handled by a subsequent patch) will require significant processing, > so pseries_devicetree_update() is called from an asynchronous workqueue > to allow rtasd to continue processing events. > > Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com> [snip] > +static s32 update_scope; Do we have a guarantee that there can only be one of these events outstanding at a time? If so it would be nice to document that in a comment next to this declaration, so we know in future that this is why this is safe. Paul.
On 03/14/2013 03:51 AM, Paul Mackerras wrote: > On Fri, Mar 08, 2013 at 10:00:09PM -0600, Nathan Fontenot wrote: >> From: Jesse Larrew <jlarrew@linux.vnet.ibm.com> >> >> A PRRN event is signaled via the RTAS event-scan mechanism, which >> returns a Hot Plug Event message "fixed part" indicating "Platform >> Resource Reassignment". In response to the Hot Plug Event message, >> we must call ibm,update-nodes to determine which resources were >> reassigned and then ibm,update-properties to obtain the new affinity >> information about those resources. >> >> The PRRN event-scan RTAS message contains only the "fixed part" with >> the "Type" field set to the value 160 and no Extended Event Log. The >> four-byte Extended Event Log Length field is repurposed (since no >> Extended Event Log message is included) to pass the "scope" parameter >> that causes the ibm,update-nodes to return the nodes affected by the >> specific resource reassignment. >> >> This patch adds a handler in rtasd for PRRN RTAS events. The function >> pseries_devicetree_update() (from mobility.c) is used to make the >> ibm,update-nodes/ibm,update-properties RTAS calls. Updating the NUMA maps >> (handled by a subsequent patch) will require significant processing, >> so pseries_devicetree_update() is called from an asynchronous workqueue >> to allow rtasd to continue processing events. >> >> Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com> > > [snip] > >> +static s32 update_scope; > > Do we have a guarantee that there can only be one of these events > outstanding at a time? If so it would be nice to document that in a > comment next to this declaration, so we know in future that this is > why this is safe. > We only allow for one event to be outstanding. When a PRRN Event is received we flush any work currently queued up and add the new event event to the workqueue (see prrn_schedule_work() from the patch). As I understand flush_work(), this would wait for any work in flight to complete, then remove all work before returning. I'll add a comment and update the patch description. -Nathan
Index: powerpc/arch/powerpc/include/asm/rtas.h =================================================================== --- powerpc.orig/arch/powerpc/include/asm/rtas.h 2013-03-08 19:56:13.000000000 -0600 +++ powerpc/arch/powerpc/include/asm/rtas.h 2013-03-08 19:56:48.000000000 -0600 @@ -143,6 +143,8 @@ #define RTAS_TYPE_PMGM_TIME_ALARM 0x6f #define RTAS_TYPE_PMGM_CONFIG_CHANGE 0x70 #define RTAS_TYPE_PMGM_SERVICE_PROC 0x71 +/* Platform Resource Reassignment Notification */ +#define RTAS_TYPE_PRRN 0xA0 /* RTAS check-exception vector offset */ #define RTAS_VECTOR_EXTERNAL_INTERRUPT 0x500 Index: powerpc/arch/powerpc/kernel/rtasd.c =================================================================== --- powerpc.orig/arch/powerpc/kernel/rtasd.c 2013-03-08 19:23:06.000000000 -0600 +++ powerpc/arch/powerpc/kernel/rtasd.c 2013-03-08 19:56:48.000000000 -0600 @@ -87,6 +87,8 @@ return "Resource Deallocation Event"; case RTAS_TYPE_DUMP: return "Dump Notification Event"; + case RTAS_TYPE_PRRN: + return "Platform Resource Reassignment Event"; } return rtas_type[0]; @@ -265,7 +267,38 @@ spin_unlock_irqrestore(&rtasd_log_lock, s); return; } +} + +static s32 update_scope; + +static void prrn_work_fn(struct work_struct *work) +{ + /* + * For PRRN, we must pass the negative of the scope value in + * the RTAS event. + */ + pseries_devicetree_update(-update_scope); +} +static DECLARE_WORK(prrn_work, prrn_work_fn); + +void prrn_schedule_update(u32 scope) +{ + flush_work(&prrn_work); + update_scope = scope; + schedule_work(&prrn_work); +} + +static void pseries_handle_event(const struct rtas_error_log *log) +{ + pSeries_log_error((char *)log, ERR_TYPE_RTAS_LOG, 0); + + if (log->type == RTAS_TYPE_PRRN) + /* For PRRN Events the extended log length is used to denote + * the scope for calling rtas update-nodes. + */ + prrn_schedule_update(log->extended_log_length); + return; } static int rtas_log_open(struct inode * inode, struct file * file) @@ -389,7 +422,7 @@ } if (error == 0) - pSeries_log_error(logdata, ERR_TYPE_RTAS_LOG, 0); + pseries_handle_event((struct rtas_error_log *)logdata); } while(error == 0); }