Message ID | 1519152302-19079-3-git-send-email-imbrenda@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
Series | s390x/sclp: 64 bit event masks | expand |
On Tue, 20 Feb 2018 19:45:01 +0100 Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> wrote: > Clean up SCLP masks: introduce an sccb_mask_t to be used for SCLP event > masks instead of just unsigned int or uint32_t. This will allow later > to extend the mask with more ease. Looks mostly sane. > > Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> > --- > hw/char/sclpconsole-lm.c | 4 ++-- > hw/char/sclpconsole.c | 4 ++-- > hw/s390x/event-facility.c | 18 +++++++++--------- > hw/s390x/sclpcpu.c | 4 ++-- > hw/s390x/sclpquiesce.c | 4 ++-- > include/hw/s390x/event-facility.h | 22 +++++++++++++--------- > 6 files changed, 30 insertions(+), 26 deletions(-) > > diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c > index c500bda..cc4d70a 100644 > --- a/hw/char/sclpconsole-lm.c > +++ b/hw/char/sclpconsole-lm.c > diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c > index 2414614..f6f28fd 100644 > --- a/hw/s390x/event-facility.c > +++ b/hw/s390x/event-facility.c > @@ -30,7 +30,7 @@ struct SCLPEventFacility { > SysBusDevice parent_obj; > SCLPEventsBus sbus; > /* guest' receive mask */ Let's make this "guest's", as you're touching the line right below. > - unsigned int receive_mask; > + sccb_mask_t receive_mask; > /* > * when false, we keep the same broken, backwards compatible behaviour as > * before; when true, we implement the architecture correctly. Needed for (...) > @@ -241,8 +241,8 @@ static void copy_mask(uint8_t *dst, uint8_t *src, uint16_t dst_len, > > static void read_event_data(SCLPEventFacility *ef, SCCB *sccb) > { > - unsigned int sclp_active_selection_mask; > - unsigned int sclp_cp_receive_mask; > + sccb_mask_t sclp_active_selection_mask = 0; Why do you need to initialize this now? > + sccb_mask_t sclp_cp_receive_mask; > > ReadEventData *red = (ReadEventData *) sccb; > > @@ -284,7 +284,7 @@ static void write_event_mask(SCLPEventFacility *ef, SCCB *sccb) > { > WriteEventMask *we_mask = (WriteEventMask *) sccb; > uint16_t mask_length = be16_to_cpu(we_mask->mask_length); > - uint32_t tmp_mask; > + sccb_mask_t tmp_mask = 0; Same here. > > if (!mask_length || (mask_length > SCLP_EVENT_MASK_LEN_MAX) || > ((mask_length != 4) && !ef->allow_all_mask_sizes)) { (...) > diff --git a/include/hw/s390x/event-facility.h b/include/hw/s390x/event-facility.h > index 5119b9b..0a8b47a 100644 > --- a/include/hw/s390x/event-facility.h > +++ b/include/hw/s390x/event-facility.h > @@ -28,12 +28,14 @@ > #define SCLP_EVENT_SIGNAL_QUIESCE 0x1d > > /* SCLP event masks */ > -#define SCLP_EVENT_MASK_SIGNAL_QUIESCE 0x00000008 > -#define SCLP_EVENT_MASK_MSG_ASCII 0x00000040 > -#define SCLP_EVENT_MASK_CONFIG_MGT_DATA 0x10000000 > -#define SCLP_EVENT_MASK_OP_CMD 0x80000000 > -#define SCLP_EVENT_MASK_MSG 0x40000000 > -#define SCLP_EVENT_MASK_PMSGCMD 0x00800000 > +#define SCLPEVMSK(T) (1ULL << (sizeof(sccb_mask_t) * 8 - (T))) SCLP_EVMASK() would be a bit more readable, I think. > + > +#define SCLP_EVENT_MASK_OP_CMD SCLPEVMSK(SCLP_EVENT_OPRTNS_COMMAND) > +#define SCLP_EVENT_MASK_MSG SCLPEVMSK(SCLP_EVENT_MESSAGE) > +#define SCLP_EVENT_MASK_CONFIG_MGT_DATA SCLPEVMSK(SCLP_EVENT_CONFIG_MGT_DATA) > +#define SCLP_EVENT_MASK_PMSGCMD SCLPEVMSK(SCLP_EVENT_PMSGCMD) > +#define SCLP_EVENT_MASK_MSG_ASCII SCLPEVMSK(SCLP_EVENT_ASCII_CONSOLE_DATA) > +#define SCLP_EVENT_MASK_SIGNAL_QUIESCE SCLPEVMSK(SCLP_EVENT_SIGNAL_QUIESCE) > > #define SCLP_UNCONDITIONAL_READ 0x00 > #define SCLP_SELECTIVE_READ 0x01
On Wed, 21 Feb 2018 16:20:05 +0100 Cornelia Huck <cohuck@redhat.com> wrote: > On Tue, 20 Feb 2018 19:45:01 +0100 > Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> wrote: > > > Clean up SCLP masks: introduce an sccb_mask_t to be used for SCLP > > event masks instead of just unsigned int or uint32_t. This will > > allow later to extend the mask with more ease. > > Looks mostly sane. > > > > > Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> > > --- > > hw/char/sclpconsole-lm.c | 4 ++-- > > hw/char/sclpconsole.c | 4 ++-- > > hw/s390x/event-facility.c | 18 +++++++++--------- > > hw/s390x/sclpcpu.c | 4 ++-- > > hw/s390x/sclpquiesce.c | 4 ++-- > > include/hw/s390x/event-facility.h | 22 +++++++++++++--------- > > 6 files changed, 30 insertions(+), 26 deletions(-) > > > > diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c > > index c500bda..cc4d70a 100644 > > --- a/hw/char/sclpconsole-lm.c > > +++ b/hw/char/sclpconsole-lm.c > > > diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c > > index 2414614..f6f28fd 100644 > > --- a/hw/s390x/event-facility.c > > +++ b/hw/s390x/event-facility.c > > @@ -30,7 +30,7 @@ struct SCLPEventFacility { > > SysBusDevice parent_obj; > > SCLPEventsBus sbus; > > /* guest' receive mask */ > > Let's make this "guest's", as you're touching the line right below. will do > > - unsigned int receive_mask; > > + sccb_mask_t receive_mask; > > /* > > * when false, we keep the same broken, backwards compatible > > behaviour as > > * before; when true, we implement the architecture correctly. > > Needed for > > (...) > > > @@ -241,8 +241,8 @@ static void copy_mask(uint8_t *dst, uint8_t > > *src, uint16_t dst_len, > > static void read_event_data(SCLPEventFacility *ef, SCCB *sccb) > > { > > - unsigned int sclp_active_selection_mask; > > - unsigned int sclp_cp_receive_mask; > > + sccb_mask_t sclp_active_selection_mask = 0; > > Why do you need to initialize this now? right, copy_mask zeroes the unused space at the end of the destination, it can be removed > > + sccb_mask_t sclp_cp_receive_mask; > > > > ReadEventData *red = (ReadEventData *) sccb; > > > > @@ -284,7 +284,7 @@ static void write_event_mask(SCLPEventFacility > > *ef, SCCB *sccb) { > > WriteEventMask *we_mask = (WriteEventMask *) sccb; > > uint16_t mask_length = be16_to_cpu(we_mask->mask_length); > > - uint32_t tmp_mask; > > + sccb_mask_t tmp_mask = 0; > > Same here. this is different, but it can still be avoided; I'll fix both. > > > > if (!mask_length || (mask_length > SCLP_EVENT_MASK_LEN_MAX) || > > ((mask_length != 4) && !ef->allow_all_mask_sizes)) { > > (...) > > > diff --git a/include/hw/s390x/event-facility.h > > b/include/hw/s390x/event-facility.h index 5119b9b..0a8b47a 100644 > > --- a/include/hw/s390x/event-facility.h > > +++ b/include/hw/s390x/event-facility.h > > @@ -28,12 +28,14 @@ > > #define SCLP_EVENT_SIGNAL_QUIESCE 0x1d > > > > /* SCLP event masks */ > > -#define SCLP_EVENT_MASK_SIGNAL_QUIESCE 0x00000008 > > -#define SCLP_EVENT_MASK_MSG_ASCII 0x00000040 > > -#define SCLP_EVENT_MASK_CONFIG_MGT_DATA 0x10000000 > > -#define SCLP_EVENT_MASK_OP_CMD 0x80000000 > > -#define SCLP_EVENT_MASK_MSG 0x40000000 > > -#define SCLP_EVENT_MASK_PMSGCMD 0x00800000 > > +#define SCLPEVMSK(T) (1ULL << (sizeof(sccb_mask_t) * 8 - (T))) > > SCLP_EVMASK() would be a bit more readable, I think. I know, but then it looks ugly when trying to fit everything in 80 columns. > > + > > +#define SCLP_EVENT_MASK_OP_CMD > > SCLPEVMSK(SCLP_EVENT_OPRTNS_COMMAND) +#define > > SCLP_EVENT_MASK_MSG SCLPEVMSK(SCLP_EVENT_MESSAGE) > > +#define SCLP_EVENT_MASK_CONFIG_MGT_DATA > > SCLPEVMSK(SCLP_EVENT_CONFIG_MGT_DATA) +#define > > SCLP_EVENT_MASK_PMSGCMD SCLPEVMSK(SCLP_EVENT_PMSGCMD) > > +#define SCLP_EVENT_MASK_MSG_ASCII > > SCLPEVMSK(SCLP_EVENT_ASCII_CONSOLE_DATA) +#define > > SCLP_EVENT_MASK_SIGNAL_QUIESCE > > SCLPEVMSK(SCLP_EVENT_SIGNAL_QUIESCE) #define > > SCLP_UNCONDITIONAL_READ 0x00 #define > > SCLP_SELECTIVE_READ 0x01 >
On Wed, 21 Feb 2018 17:42:57 +0100 Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> wrote: > On Wed, 21 Feb 2018 16:20:05 +0100 > Cornelia Huck <cohuck@redhat.com> wrote: > > > On Tue, 20 Feb 2018 19:45:01 +0100 > > Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> wrote: > > > diff --git a/include/hw/s390x/event-facility.h > > > b/include/hw/s390x/event-facility.h index 5119b9b..0a8b47a 100644 > > > --- a/include/hw/s390x/event-facility.h > > > +++ b/include/hw/s390x/event-facility.h > > > @@ -28,12 +28,14 @@ > > > #define SCLP_EVENT_SIGNAL_QUIESCE 0x1d > > > > > > /* SCLP event masks */ > > > -#define SCLP_EVENT_MASK_SIGNAL_QUIESCE 0x00000008 > > > -#define SCLP_EVENT_MASK_MSG_ASCII 0x00000040 > > > -#define SCLP_EVENT_MASK_CONFIG_MGT_DATA 0x10000000 > > > -#define SCLP_EVENT_MASK_OP_CMD 0x80000000 > > > -#define SCLP_EVENT_MASK_MSG 0x40000000 > > > -#define SCLP_EVENT_MASK_PMSGCMD 0x00800000 > > > +#define SCLPEVMSK(T) (1ULL << (sizeof(sccb_mask_t) * 8 - (T))) > > > > SCLP_EVMASK() would be a bit more readable, I think. > > I know, but then it looks ugly when trying to fit everything in 80 > columns. I'd rather go slightly over 80 in that case (as long as you don't cross 90). > > > > + > > > +#define SCLP_EVENT_MASK_OP_CMD > > > SCLPEVMSK(SCLP_EVENT_OPRTNS_COMMAND) +#define > > > SCLP_EVENT_MASK_MSG SCLPEVMSK(SCLP_EVENT_MESSAGE) > > > +#define SCLP_EVENT_MASK_CONFIG_MGT_DATA > > > SCLPEVMSK(SCLP_EVENT_CONFIG_MGT_DATA) +#define > > > SCLP_EVENT_MASK_PMSGCMD SCLPEVMSK(SCLP_EVENT_PMSGCMD) > > > +#define SCLP_EVENT_MASK_MSG_ASCII > > > SCLPEVMSK(SCLP_EVENT_ASCII_CONSOLE_DATA) +#define > > > SCLP_EVENT_MASK_SIGNAL_QUIESCE > > > SCLPEVMSK(SCLP_EVENT_SIGNAL_QUIESCE) #define > > > SCLP_UNCONDITIONAL_READ 0x00 #define > > > SCLP_SELECTIVE_READ 0x01 > > >
On Wed, 21 Feb 2018 18:30:12 +0100 Cornelia Huck <cohuck@redhat.com> wrote: > On Wed, 21 Feb 2018 17:42:57 +0100 > Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> wrote: > > > On Wed, 21 Feb 2018 16:20:05 +0100 > > Cornelia Huck <cohuck@redhat.com> wrote: > > > > > On Tue, 20 Feb 2018 19:45:01 +0100 > > > Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> wrote: > > > > > diff --git a/include/hw/s390x/event-facility.h > > > > b/include/hw/s390x/event-facility.h index 5119b9b..0a8b47a > > > > 100644 --- a/include/hw/s390x/event-facility.h > > > > +++ b/include/hw/s390x/event-facility.h > > > > @@ -28,12 +28,14 @@ > > > > #define SCLP_EVENT_SIGNAL_QUIESCE 0x1d > > > > > > > > /* SCLP event masks */ > > > > -#define SCLP_EVENT_MASK_SIGNAL_QUIESCE 0x00000008 > > > > -#define SCLP_EVENT_MASK_MSG_ASCII 0x00000040 > > > > -#define SCLP_EVENT_MASK_CONFIG_MGT_DATA 0x10000000 > > > > -#define SCLP_EVENT_MASK_OP_CMD 0x80000000 > > > > -#define SCLP_EVENT_MASK_MSG 0x40000000 > > > > -#define SCLP_EVENT_MASK_PMSGCMD 0x00800000 > > > > +#define SCLPEVMSK(T) (1ULL << (sizeof(sccb_mask_t) * 8 - > > > > (T))) > > > > > > SCLP_EVMASK() would be a bit more readable, I think. > > > > I know, but then it looks ugly when trying to fit everything in 80 > > columns. > > I'd rather go slightly over 80 in that case (as long as you don't > cross 90). will do > > > > > > + > > > > +#define SCLP_EVENT_MASK_OP_CMD > > > > SCLPEVMSK(SCLP_EVENT_OPRTNS_COMMAND) +#define > > > > SCLP_EVENT_MASK_MSG SCLPEVMSK(SCLP_EVENT_MESSAGE) > > > > +#define SCLP_EVENT_MASK_CONFIG_MGT_DATA > > > > SCLPEVMSK(SCLP_EVENT_CONFIG_MGT_DATA) +#define > > > > SCLP_EVENT_MASK_PMSGCMD SCLPEVMSK(SCLP_EVENT_PMSGCMD) > > > > +#define SCLP_EVENT_MASK_MSG_ASCII > > > > SCLPEVMSK(SCLP_EVENT_ASCII_CONSOLE_DATA) +#define > > > > SCLP_EVENT_MASK_SIGNAL_QUIESCE > > > > SCLPEVMSK(SCLP_EVENT_SIGNAL_QUIESCE) #define > > > > SCLP_UNCONDITIONAL_READ 0x00 #define > > > > SCLP_SELECTIVE_READ 0x01 > > > > > >
diff --git a/hw/char/sclpconsole-lm.c b/hw/char/sclpconsole-lm.c index c500bda..cc4d70a 100644 --- a/hw/char/sclpconsole-lm.c +++ b/hw/char/sclpconsole-lm.c @@ -102,12 +102,12 @@ static bool can_handle_event(uint8_t type) return type == SCLP_EVENT_MESSAGE || type == SCLP_EVENT_PMSGCMD; } -static unsigned int send_mask(void) +static sccb_mask_t send_mask(void) { return SCLP_EVENT_MASK_OP_CMD | SCLP_EVENT_MASK_PMSGCMD; } -static unsigned int receive_mask(void) +static sccb_mask_t receive_mask(void) { return SCLP_EVENT_MASK_MSG | SCLP_EVENT_MASK_PMSGCMD; } diff --git a/hw/char/sclpconsole.c b/hw/char/sclpconsole.c index d0265df..ec9db13 100644 --- a/hw/char/sclpconsole.c +++ b/hw/char/sclpconsole.c @@ -83,12 +83,12 @@ static bool can_handle_event(uint8_t type) return type == SCLP_EVENT_ASCII_CONSOLE_DATA; } -static unsigned int send_mask(void) +static sccb_mask_t send_mask(void) { return SCLP_EVENT_MASK_MSG_ASCII; } -static unsigned int receive_mask(void) +static sccb_mask_t receive_mask(void) { return SCLP_EVENT_MASK_MSG_ASCII; } diff --git a/hw/s390x/event-facility.c b/hw/s390x/event-facility.c index 2414614..f6f28fd 100644 --- a/hw/s390x/event-facility.c +++ b/hw/s390x/event-facility.c @@ -30,7 +30,7 @@ struct SCLPEventFacility { SysBusDevice parent_obj; SCLPEventsBus sbus; /* guest' receive mask */ - unsigned int receive_mask; + sccb_mask_t receive_mask; /* * when false, we keep the same broken, backwards compatible behaviour as * before; when true, we implement the architecture correctly. Needed for @@ -60,9 +60,9 @@ static bool event_pending(SCLPEventFacility *ef) return false; } -static unsigned int get_host_send_mask(SCLPEventFacility *ef) +static sccb_mask_t get_host_send_mask(SCLPEventFacility *ef) { - unsigned int mask; + sccb_mask_t mask; BusChild *kid; SCLPEventClass *child; @@ -76,9 +76,9 @@ static unsigned int get_host_send_mask(SCLPEventFacility *ef) return mask; } -static unsigned int get_host_receive_mask(SCLPEventFacility *ef) +static sccb_mask_t get_host_receive_mask(SCLPEventFacility *ef) { - unsigned int mask; + sccb_mask_t mask; BusChild *kid; SCLPEventClass *child; @@ -188,7 +188,7 @@ out: } static uint16_t handle_sccb_read_events(SCLPEventFacility *ef, SCCB *sccb, - unsigned int mask) + sccb_mask_t mask) { uint16_t rc; int slen; @@ -241,8 +241,8 @@ static void copy_mask(uint8_t *dst, uint8_t *src, uint16_t dst_len, static void read_event_data(SCLPEventFacility *ef, SCCB *sccb) { - unsigned int sclp_active_selection_mask; - unsigned int sclp_cp_receive_mask; + sccb_mask_t sclp_active_selection_mask = 0; + sccb_mask_t sclp_cp_receive_mask; ReadEventData *red = (ReadEventData *) sccb; @@ -284,7 +284,7 @@ static void write_event_mask(SCLPEventFacility *ef, SCCB *sccb) { WriteEventMask *we_mask = (WriteEventMask *) sccb; uint16_t mask_length = be16_to_cpu(we_mask->mask_length); - uint32_t tmp_mask; + sccb_mask_t tmp_mask = 0; if (!mask_length || (mask_length > SCLP_EVENT_MASK_LEN_MAX) || ((mask_length != 4) && !ef->allow_all_mask_sizes)) { diff --git a/hw/s390x/sclpcpu.c b/hw/s390x/sclpcpu.c index 3ee890b..50c021b 100644 --- a/hw/s390x/sclpcpu.c +++ b/hw/s390x/sclpcpu.c @@ -37,12 +37,12 @@ void raise_irq_cpu_hotplug(void) sclp_service_interrupt(0); } -static unsigned int send_mask(void) +static sccb_mask_t send_mask(void) { return SCLP_EVENT_MASK_CONFIG_MGT_DATA; } -static unsigned int receive_mask(void) +static sccb_mask_t receive_mask(void) { return 0; } diff --git a/hw/s390x/sclpquiesce.c b/hw/s390x/sclpquiesce.c index 0241643..1c8f5c9 100644 --- a/hw/s390x/sclpquiesce.c +++ b/hw/s390x/sclpquiesce.c @@ -28,12 +28,12 @@ static bool can_handle_event(uint8_t type) return type == SCLP_EVENT_SIGNAL_QUIESCE; } -static unsigned int send_mask(void) +static sccb_mask_t send_mask(void) { return SCLP_EVENT_MASK_SIGNAL_QUIESCE; } -static unsigned int receive_mask(void) +static sccb_mask_t receive_mask(void) { return 0; } diff --git a/include/hw/s390x/event-facility.h b/include/hw/s390x/event-facility.h index 5119b9b..0a8b47a 100644 --- a/include/hw/s390x/event-facility.h +++ b/include/hw/s390x/event-facility.h @@ -28,12 +28,14 @@ #define SCLP_EVENT_SIGNAL_QUIESCE 0x1d /* SCLP event masks */ -#define SCLP_EVENT_MASK_SIGNAL_QUIESCE 0x00000008 -#define SCLP_EVENT_MASK_MSG_ASCII 0x00000040 -#define SCLP_EVENT_MASK_CONFIG_MGT_DATA 0x10000000 -#define SCLP_EVENT_MASK_OP_CMD 0x80000000 -#define SCLP_EVENT_MASK_MSG 0x40000000 -#define SCLP_EVENT_MASK_PMSGCMD 0x00800000 +#define SCLPEVMSK(T) (1ULL << (sizeof(sccb_mask_t) * 8 - (T))) + +#define SCLP_EVENT_MASK_OP_CMD SCLPEVMSK(SCLP_EVENT_OPRTNS_COMMAND) +#define SCLP_EVENT_MASK_MSG SCLPEVMSK(SCLP_EVENT_MESSAGE) +#define SCLP_EVENT_MASK_CONFIG_MGT_DATA SCLPEVMSK(SCLP_EVENT_CONFIG_MGT_DATA) +#define SCLP_EVENT_MASK_PMSGCMD SCLPEVMSK(SCLP_EVENT_PMSGCMD) +#define SCLP_EVENT_MASK_MSG_ASCII SCLPEVMSK(SCLP_EVENT_ASCII_CONSOLE_DATA) +#define SCLP_EVENT_MASK_SIGNAL_QUIESCE SCLPEVMSK(SCLP_EVENT_SIGNAL_QUIESCE) #define SCLP_UNCONDITIONAL_READ 0x00 #define SCLP_SELECTIVE_READ 0x01 @@ -71,6 +73,8 @@ typedef struct WriteEventMask { #define WEM_RECEIVE_MASK(wem, mask_len) ((wem)->masks + 2 * (mask_len)) #define WEM_SEND_MASK(wem, mask_len) ((wem)->masks + 3 * (mask_len)) +typedef uint32_t sccb_mask_t; + typedef struct EventBufferHeader { uint16_t length; uint8_t type; @@ -160,7 +164,7 @@ typedef struct WriteEventData { typedef struct ReadEventData { SCCBHeader h; union { - uint32_t mask; + sccb_mask_t mask; EventBufferHeader ebh; }; } QEMU_PACKED ReadEventData; @@ -177,10 +181,10 @@ typedef struct SCLPEventClass { int (*exit)(SCLPEvent *event); /* get SCLP's send mask */ - unsigned int (*get_send_mask)(void); + sccb_mask_t (*get_send_mask)(void); /* get SCLP's receive mask */ - unsigned int (*get_receive_mask)(void); + sccb_mask_t (*get_receive_mask)(void); int (*read_event_data)(SCLPEvent *event, EventBufferHeader *evt_buf_hdr, int *slen);
Clean up SCLP masks: introduce an sccb_mask_t to be used for SCLP event masks instead of just unsigned int or uint32_t. This will allow later to extend the mask with more ease. Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com> --- hw/char/sclpconsole-lm.c | 4 ++-- hw/char/sclpconsole.c | 4 ++-- hw/s390x/event-facility.c | 18 +++++++++--------- hw/s390x/sclpcpu.c | 4 ++-- hw/s390x/sclpquiesce.c | 4 ++-- include/hw/s390x/event-facility.h | 22 +++++++++++++--------- 6 files changed, 30 insertions(+), 26 deletions(-)